Qt5 中关于信号槽 SIGNALS/SLOTS的改动

原创
2014/04/20 10:42
阅读数 4.6K

Qt5释出对信号/槽的新方法。保证了在编译阶段即可对信号槽使用进行检查,避免了到运行阶段才发现问题的尴尬。现将旧/新的信号槽用法进行回顾总结。

Qt4中最常用的信号槽写法:

connect(obj1, SIGNAL(fun1(param1, param2,...)), obj2, SLOT(fun2(param1,...)));
//编译后
connect(obj1, "fun1(param1, param2,...)", obj2, "fun2(param1,...)");

在程序编译阶段,程序会将函数以字符串的形式进行链接,程序不会检查信号/槽函数是否存在,只有在运行期间才会验证是否正确。

Qt5中的新语法:

connect(obj1, &ClassA::fun1, obj2, &ClassB::fun2);

编译期间就会检查信号与槽是否存在,参数类型检查,Q_OBJECT是否存在。

相比较Qt4中的语法,有了大的改进,而且槽函数不在限定必须是slot,可以是普通的函数、类的普通成员函数、lambda函数等。但是在新的语法中又带来了新问题,如果函数重载,有可能会造成程序的困扰,不知道该具体链接哪个。在此,我们有两种方法解决。

注:以下两种方法用在信号函数,或槽函数都可。

一:在使用connect函数前,对要链接的信号/槽函数使用函数指针,防止混淆。

//类函数指针。
void (ClassA::* p)(param1, param2, ....) = &ClassA::fun1;
connect(obj1, p, obj2, &ClassB::fun2);

二:在connect函数中使用c++的static_cast,来进行动态转换。

connect(obj1, static_cast<void (ClassA::*)(param1, param2, ....)>(&ClassA::fun1),
        obj2, &ClassB::fun2);


展开阅读全文
打赏
5
39 收藏
分享
加载中

引用来自“pollex”的评论

C++,世界上唯一一个极度复杂,而且越搞越复杂,越发展越复杂的程序设计语言。有多复杂呢,随便写些和模板有关的代码留些错误,你就能看到一大堆比火星文还难懂的晦涩的错误提示,而这还不到C++的复杂度的1%。
哈哈,STL内部错误也和火星文一样。不过其实很多都是typedef的展开,把它们折叠一下就能看懂了
2014/04/23 00:58
回复
举报

引用来自“sucker”的评论

引用来自“pollex”的评论

C++,世界上唯一一个极度复杂,而且越搞越复杂,越发展越复杂的程序设计语言。有多复杂呢,随便写些和模板有关的代码留些错误,你就能看到一大堆比火星文还难懂的晦涩的错误提示,而这还不到C++的复杂度的1%。

说得太对了
哈哈,STL内部错误也和火星文一样。不过其实很多都是typedef的展开,把它们折叠一下就能看懂了
2014/04/23 00:57
回复
举报

引用来自“pollex”的评论

C++,世界上唯一一个极度复杂,而且越搞越复杂,越发展越复杂的程序设计语言。有多复杂呢,随便写些和模板有关的代码留些错误,你就能看到一大堆比火星文还难懂的晦涩的错误提示,而这还不到C++的复杂度的1%。

说得太对了
2014/04/22 10:47
回复
举报

引用来自“卖姑娘的小火柴”的评论

还是原来那种形式漂亮业
新语法可以直接和lambda混合使用的、、而且新语法是直接储存地址效率应该还会稍微提升的、、个人比较喜欢新语法、、、
2014/04/22 09:57
回复
举报
保证了在编译阶段即可对信号槽使用进行检查,避免了到运行阶段才发现问题的尴尬
——上次被虐出翔
2014/04/22 09:51
回复
举报
还是原来的好
2014/04/22 09:42
回复
举报
虽然用5了,还是一直使用4的方式
2014/04/22 09:33
回复
举报
这样改变挺好
2014/04/22 08:51
回复
举报
C++,世界上唯一一个极度复杂,而且越搞越复杂,越发展越复杂的程序设计语言。有多复杂呢,随便写些和模板有关的代码留些错误,你就能看到一大堆比火星文还难懂的晦涩的错误提示,而这还不到C++的复杂度的1%。
2014/04/21 18:55
回复
举报
这个不错,建议大家看看,很基础、很实用的东西。
2014/04/21 14:10
回复
举报
更多评论
打赏
11 评论
39 收藏
5
分享
返回顶部
顶部