Qt槽收不到信号? 您所在的位置:网站首页 Qt的connect函数连接不上 Qt槽收不到信号?

Qt槽收不到信号?

2024-02-03 19:21| 来源: 网络整理| 查看: 265

       使用背景:刚接触Qt,一定会遇到信号和槽都写完了,也连接好了,编译没有报错,但是就是无法收到信号。原因在于使用了旧的connect写法时,不会进行编译检查,也就是说connect()函数一定不对。这里推荐使用Qt5,Qt5中的信号和槽相对于之前版本有了很大的变化,目的在于更好用,更安全。Qt4的版本看起来简单,实际使用中会遇到各种无法解释的问题,问题在于老版本并不进行安全检查,会让你错误的以为你写的语法没错误,信号就一定是对的。

        Qt4中的关联方法:

connect(sender, SIGNAL(valueChanged()), recevier, SLOT(valueHandle()));

        Qt5中的关联方法:

connect(sender, &sender::valueChanged, recevier, &recevier::valueHandle);

     Qt4connect的实现过程:

将SIGNAL()和SLOT()这两个宏的参数转换成相应的字符串。编译之前,Qt的moc工具从源码中提取出所需要的初始数据,生成一张字符串表,表中的数据就是所有使用了signal和slots修饰过的函数。connect开始查表,将关联起来的字符串进行比较匹配。匹配正确则在信号发出后调用相应的槽函数。

       这种方法可以看出,只要放入了关键字中的函数就会加入表中,并且再connect的时候去查表,根本不理会这些函数的类型。并且对比时是字符串对比,虽然能够保证信号和槽的传参一致,但是也不会去辨别namespace类型。

     因此Qt5做了大量改进:

编译期检查。在编译期时就对拼写及参数不匹配进行检查。支持相容类型,隐式的自动转换。假设信号参数是int,槽函数参数是QVariant,那么在连接时会将int自动转换为QVariant。可以连接到任意函数。不仅仅可以连接到slots修饰的函数,包括函数指针的函数,任意的成员函数、Lambda表达式的匿名函数等。

      Qt5信号和槽没有缺点吗?也是有的,有一种情况下推荐使用Qt4,就是信号函数出现了重载。这种情况下使用&sender::valueChanged获取信号的指针时会有歧义。

void valueChanged(int i); void valueChanged(QString temp);

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有