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);
来源: http://www.bubuko.com/infodetail-3716908.html