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

2022/1/14:增加模板方法 “template <typename T> auto qOverload(T functionPointer)” 在信号槽中遇到函数重载情况的使用,此方法于 Version5.7 引入。

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);

三:使用 Qt 自带的 Overload 模板方法将重载函数具体指定。

connect(obj1, QOverload<param1, param2, param3...>::of(&ClassA::fun1),
        obj2, &ClassB::fun2);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值