zoukankan      html  css  js  c++  java
  • qt5 connect问题

    参考资料:Qt学习之路2
        在qt从4到5的升级过程中,connect的方法只是添加了一些重载的形式,qt5新增的connect添加了编译器类型检查,如果遇到匹配失败的,或者找不到信号/槽的地方,会直接报错,而不是qt4到运行期才告诉用户。新版本qt在connect的支持方面是兼容以前的老版本的,因此在以前使用qt4.x,而现在升级到qt5.x的项目大可以不更改这些connect。
        新版本的connect,使用函数指针能够获得编译期的类型检查,而这样也有弊端,当遇到重载信号槽的时候在编译器就会报错,说“无法将参数 2 从“overloaded-function”转换为“const char *”上下文不允许消除重载函数的歧义
        针对以上问题,我们首先分析错误原因,编译器无从知道信号/槽具体调用的是哪个方法,因此我们介绍两种方式来解决这个问题。
    • 方式1:手动声明一个函数指针,指向目标的信号/槽方法;
    • 方式2:使用C++的静态类型转换。

        针对以上两种方式,给处如下事例

    方式1事例如下:

    void (ClassA:: *p)(QString, QDate) = &ClassA::signalFunciton;
    
    QObject::connect(&a, p, &b, &Reader::slotFunction);
    或者

    QObject::connect(&a,
    (void (ClassA:: *)(QString, ))&ClassA::signalFunciton, b, &ClassB::slotFunction);
    方式2事例如下:

    QObject::connect(&a, static_cast<void (ClassA:: *)(QString)>(&ClassA::signalFunction), &b, &ClassB::slotFunction);   
        对比上面两种写法。第一个使用的是 C 风格的强制类型转换。此时,如果你改变了信号的类型,那么你就会有一个潜在的运行时错误。例如,如果我们把 (QString, QDate) 两个参数修改成 (QDate, QString),C 风格的强制类型转换就会失败,并且这个错误只能在运行时发现。而第二种则是 C++ 推荐的风格,当参数类型改变时,编译器会检测到这个错误。

        注意,这里我们只是强调了函数参数的问题。如果前面的对象都错了呢?比如,我们写的a对象并不是一个 signalFunction,而是 signalFunction2?此时,编译器会直接失败,因为 connect() 函数会去寻找 sender->*signal,如果这两个参数不满足,则会直接报错。

        写这个博文的时候其实是想写qt的多语化的,不过不要紧,马上写,事例代码都已经准备OK了qt5 <wbr>connect问题

    如果您觉得文章不错,不妨给个打赏,写作不易,感谢各位的支持。您的支持是我最大的动力,谢谢!!! 

     

      


    很重要--转载声明

    1. 本站文章无特别说明,皆为原创,版权所有,转载时请用链接的方式,给出原文出处。同时写上原作者:朝十晚八 or Twowords
    2. 如要转载,请原文转载,如在转载时修改本文,请事先告知,谢绝在转载时通过修改本文达到有利于转载者的目的。 

  • 相关阅读:
    C#微信公众号开发 -- (一)开发之前的准备
    C#微信公众号学习
    微信模板消息发送帮助类
    Java平台调用.net开发的WebService报错处理
    sql语句单据编号生成防并发
    [转]实用教程:搭建FTP服务器以实现局域网飞速传输文件
    C# Post Json数据到对方url
    sql语句优化技巧
    Html添加百度地图
    查看CentOS版本
  • 原文地址:https://www.cnblogs.com/swarmbees/p/5621414.html
Copyright © 2011-2022 走看看