zoukankan      html  css  js  c++  java
  • Qt5 中关于信号槽 SIGNALS/SLOTS的改动

    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);
     
  • 相关阅读:
    Mac 自带 apache 服务器
    比较器Comparable Comparator
    深入学习二叉树(01)完全二叉树
    深入学习二叉树(02)线索二叉树
    深入学习二叉树(06)霍夫曼树/哈夫曼编码/最优二叉树
    深入学习二叉树(05)红黑树
    深入学习二叉树(07)B树
    Java 1.8 红黑树
    ConcurrentHashMap 结构 1.7 与1.8
    git 操作详情
  • 原文地址:https://www.cnblogs.com/weiweiqiao99/p/14288355.html
Copyright © 2011-2022 走看看