参考资料: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了

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

 

很重要--转载声明

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

qt5 connect问题的更多相关文章

  1. Qt5 connect 重载信号和槽

    转载文章超哥的经验之谈---Qt5 connect使用之"重载信号和槽" 在Qt4中,关联信号与槽是要使用到SIGNAL()和SLOT()这两个宏. QLabel *label = ...

  2. QT中的小细节

    一 .  QT4和QT5的区别(信号和槽):1.  QT4: connect(button,SIGNAL(pressed()),this,SLOT(close())); /** * 优点 :写法简单 ...

  3. Qt 学习之路 2(17):文件对话框

    Home / Qt 学习之路 2 / Qt 学习之路 2(17):文件对话框 Qt 学习之路 2(17):文件对话框  豆子  2012年9月24日  Qt 学习之路 2  85条评论 在前面的章节中 ...

  4. [Qt5] How to connect c++ with QML

    Qt5处于过度阶段,架构繁琐,学习成本不低.尤其是UI代码竟然被重写,变了天. Qt中的c++可能是连接OPENCV与QML的一个不错的桥梁,在此学习这部分实用的技术. Reference: http ...

  5. Qt5中的lambda表达式和使用lambda来写connect

    c11新特性中加入了lambda表达式,所以Qt 也支持 需在.pro文件中加入 CONFIG += c++11 例子: QString program = "C:/Windows/Syst ...

  6. QT5利用chromium内核与HTML页面交互

    在QT5.4之前,做QT开发浏览器只能选择QWebkit,但是有过使用的都会发现,这个webkit不是出奇的慢,简直是慢的令人发指,Release模式下还行,debug下你就无语了,但是webkit毕 ...

  7. qt5中信号和槽的新语法

    qt5中的连接 有下列几种方式可以连接到信号上 旧语法 qt5将继续支持旧的语法去连接,在QObject对象上定义信号和槽函数,及任何继承QObjec的对象(包含QWidget). connect(s ...

  8. Qt5中的信号槽

    Qt4中的信号槽 Qt4中的信号槽是通过SIGNAL,SLOT两个宏,将参数转换成字符串.Qt编译前,会从源码的头文件中提取由signal和slot声明的信号和槽的函数, 将其组成一张信号和槽对应的字 ...

  9. Qt5.5.0使用mysql编写小软件源码讲解---顾客信息登记表

    Qt5.5.0使用mysql编写小软件源码讲解---顾客信息登记表 一个个人觉得比较简单小巧的软件. 下面就如何编写如何发布打包来介绍一下吧! 先下载mysql的库文件链接:http://files. ...

随机推荐

  1. 2018-2019-2 20175305实验一《Java开发环境的熟悉》实验报告

    2018-2019-2 20175305实验一<Java开发环境的熟悉>实验报告 实验题目 实验一Java开发环境的熟悉-1 1).实验目的及要求 1.建立"自己学号exp1&q ...

  2. TCP/IP详解 卷一学习笔记(转载)

    https://blog.csdn.net/cpcpcp123/article/details/51259498

  3. HDU - 1827 Summer Holiday (强连通)

    <题目链接> 题目大意: 听说lcy帮大家预定了新马泰7日游,Wiskey真是高兴的夜不能寐啊,他想着得快点把这消息告诉大家,虽然他手上有所有人的联系方式,但是一个一个联系过去实在太耗时间 ...

  4. 1.3 正则表达式和Python语言-1.3.5使用 search()在一个字符串中查找模式(搜索与匹配 的对比)

    1.3.5 使用 search()在一个字符串中查找模式(搜索与匹配的对比) 其实,想要搜索的模式出现在一个字符串中间部分的概率,远大于出现在字符串起始部分的概率.这也就是 search()派上用场的 ...

  5. 英语知识积累-D01-body+animal

    My body What's your name? Here are lots of children playing. Are they happy or sad? Who's waving at ...

  6. 我的 FPGA 学习历程(01)—— FPGA 基础知识和 Quartus 的安装

    高级的嵌入式市场主要分为以下三类:ARM.DSP 和 FPGA. 其中 ARM 是行业内的佼佼者,目前几乎所有的安卓智能手机都使用 ARM 授权的 CPU架构:而 DSP(数字信号处理器) 早年就被大 ...

  7. Chapter 5 : Control Structures 2 : Repetition

    import java.util.*; import java.io.*; public class Loop { static Scanner console = new Scanner(Syste ...

  8. Django网站制作根目录,巧用404,可访问根目录任意网页

    原文链接:http://www.bianbingdang.com/article_detail/106.html 在制作网页过程中,网站需要格式各样的验证.比如百度站长.搜狗联盟的校验网站.不止如此, ...

  9. KindEditor富文本编辑器, 从客户端中检测到有潜在危险的 Request.Form 值

    在用富文本编辑器时经常会遇到的问题是asp.net报的”检测到有潜在危险的 Request.Form 值“一般的解法是在aspx页面   page  标签中加上 validaterequest='fa ...

  10. Java_异常处理

    这篇我们聊聊java中的异常.首先我们要知道什么是异常? Exception: exception翻译过来就是“意外”的意思.事实上,异常的本质就是程序的错误,包括程序逻辑错误和系统错误.错误在编写程 ...