Qt —— Qt4与Qt5的信号槽差异详解

本文对比了Qt4和Qt5中信号槽的语法差异,指出Qt4中信号槽的运行时匹配和类型限制问题,并详细介绍了Qt5新语法的优势,如编译期检查、兼容类型转换和连接任意函数。通过示例展示了如何处理重载信号和槽函数的连接问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

新旧语法对比

     举例介绍。某个类在值变化时发送valueChanged(QString,QString)信号,需要在槽showValue(QString)中对改变的值做相应的处理。在Qt4中一般这样来关联信号和槽:

     connect(sender,SIGNAL(valueChanged(QString,QString)),receiver,SLOT(showValue(QString)));

     Qt4的SIGNAL和SLOT两个宏,实际是将其参数转换成相应的字符串。在编译之前,Qt的moc工具从源代码中提取出所需要的元数据,形成一张由使用了signals和slots修饰的所有函数组成的字符串表。connect函数将与信号关联起来的槽的字符串,同这张字符串中的信息进行匹配,也就能够在发出信号时知道需要调用哪个槽函数。

     这种实现有下面两个问题

          1、没有编译期检查。由于信号和槽都会被SIGNAL和SLOT宏处理成字符串,字符串的对比是在运行时完成的,并且失去了类型信息。所以,我们在编写Qt4程序时,有时会出现编译通过但是运行时原本应该调用的槽函数却没有执行。此时,编译器不能给出任何错误信息,只能在运行时看有没有警告
          2、无法使用相容类型的参数。由于connect函数使用的是字符串对比,所以槽函数参数类型的名称必须和信号的完全一致,也必须与头文件中的类型一致。这里的”一致“是严格的字符串意义上的相同,因此,那些使用了tyoedef或者namespace的类型,即便实际类型是相同的,依然可能由于字符串名字不一样而不能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

信必诺

嗨,支持下哥们呗。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值