以下几种情况会导致信号槽连接不成功,下面分别描述。

1. 拥有信号槽的类,必须继承QObject,声明Q_OBJECT宏。

Qt帮助手册里搜索 “Signals & Slots”,可以看到以下说明:

想要使用信号槽,必须继承QObject,必须加Q_OBJECT宏。

2. 信号槽函数签名不匹配

主要分以下几种情形:

  • 信号槽参数类型不匹配:如int对double。需要特别指出的是,在参数类型属于某命名空间时,要把命名空间写完整!

  • 信号槽参数个数不匹配;

  • 数签名只需要参数类型,不可以写参数名称和返回值。如:void func(int a)要写成func(int)。

3. 连接方式为Qt::QueuedConnection时,参数类型没有注册。

需要使用

qRegisterMetaType<此处为变量类型名称>("此处为变量类型名称");

来注册。
在Qt帮助手册中搜索qRegisterMetaType,有相关说明。

注意在连接方式为Qt::DirectConnection(阻塞式触发),不存在此问题。因为阻塞式触发,只需要将参数进行值传递,拷贝过去即可。而以Qt::QueuedConnection(消息队列式)连接的情况下,需要将变量转成通用数据类型QVariant存储,而用QVariant存储,必须要注册此类型。

4. 两个子线程之间在运行时,从一个线程connect另外一个线程,会提示连接不成功。

解决方法:通过主线程中转信号。

5.connect时,信号槽函数参数只要给出类型,不要写参数名称。

如连接

connect(this, SIGNAL(sigOk(int)),this,SLOT(slotOk(int)))

写成下面这样是错误的:

connect(this,SIGNAL(sigOk(int value)),this,SLOT(slotOk(int value)))

根据需要,可以采用另外一种connect方式:

connect(this, &MyClass::sigOk, this, &MyClass::slotOk);

这种方式可以不写参数,更简单,但是正因为不写参数,如果出现问题,就会比较隐晦,根据实际需要使用。


本文原创发布于公众号Qt未来工程师。

【Qt开发经验】Qt信号槽连接不成功问题原因汇总相关推荐

  1. Qt——P13 Q4版本信号槽连接

    widget.cpp #include "widget.h" #include "ui_widget.h" #include <QPushButton&g ...

  2. QT C++ 《信号-槽 基本操作》

    目录 <信号-槽 基本操作> 信号-槽连接 信号-槽断开连接 信号-槽连接 connect(ui.pushButton_SIGNAL, SIGNAL(clicked()), Client_ ...

  3. Qt线程间信号槽传递自定义数据类型(qRegisterMetaType的使用)

    Qt线程间信号槽传递自定义数据类型(qRegisterMetaType的使用) #include <QMetaType> CFileDataModel::CFileDataModel(QO ...

  4. Qt / Moc 和信号 - 槽解析

    目录 一. MOC 二. moc_test.cpp 分析 三. connect 四. activate 五. 总结 版本 Qt5.12.3 moc_test.cpp 位于可执行文件目录下,其余源代码都 ...

  5. Qt多线程间信号槽传递非QObject类型对象的参数

    一.以前就发现过这个问题: 在Qt项目中,有时候为了让自己的类,可以重载操作符 '=','<<','>>'. 也有时候需要用一个类进行文件的读写,所以很多C++类还是要简单化的 ...

  6. 玩转Qt(6)-认清信号槽的本质

    简介 猫和老鼠的故事 对象之间的通信机制 尝试一:直接调用 尝试二:回调函数+映射表 观察者模式 Qt的信号-槽 信号-槽简介 信号-槽分两种 信号-槽的实现 元对象编译器moc moc的本质-反射 ...

  7. QT:PushButton+信号槽+Label简单使用

    实现内容 创建一个简单的QT GUI项目,实现点击按钮修改Label的内容 创建QT GUI 项目:ButtonTest 创建后的目录为: 添加界面布局 在界面添加两个PushButton和一个Lab ...

  8. Qt学习笔记-----信号槽

    Qt提供signals and slots mechanism(信号槽机制)来保证两个对象之前的关联(connection). 所谓信号槽,简单理解就是两部分,一个是某对象发出的信号,一个是某对象接收 ...

  9. Qt中绑定信号槽之后,信号槽无效

    下面程序编译没有错误,运行却未达到想要的效果,最后调试发现,是信号槽绑定后无效,即槽函数没有受到信号的触发.具体代码如下: main.cpp #include <QtCore> #incl ...

最新文章

  1. linux docker 目录挂载映射
  2. python如何编写excel_如何用Python编写Excel
  3. flutter怎么手动刷新_flutter局部刷新的实现示例
  4. acm java_ACM Java Native SDK 概述
  5. linux目录删除不释放空间,删除linux文件后,磁盘空间未释放的解决办法
  6. dataoutputstream.write 有时无法发送_RTK实操——CORS官方网教您如何解决RTK无法固定的问题...
  7. 软件工程结构化建模的方法和工具_软件工程导论知识点梳理之概念题
  8. Mybatis(17)注解方式增删改查单表
  9. java线程池1001java线程池_深入浅出Java(Android )线程池ThreadPoolExecutor
  10. 面向未来 “亿”触即发-中科曙光技术创新大会重磅发布多项创新举措与成果...
  11. innodb 索引 mysql_InnoDB索引实现
  12. jquery怎么选择 某个指定id的div下面的第2个子div再设置css?
  13. 卡方检验与方差分析的区别
  14. 2021-07-19支付宝扫码点餐推广怎么做(干货来了)
  15. LIN雨量传感器:MQB平台与PQ自带的传感器类型分析
  16. C语言刷题随记 —— 国际象棋棋盘
  17. java 设置纸张大小设置_java 用itext设置pdf纸张大小操作
  18. mnist数据集百度云链接
  19. Lytro In Matlab
  20. 复星金服微服务_复星金控携手医伴金服加快医疗金融布局

热门文章

  1. 怎样使用两行代码实现博客园打赏功能
  2. webapp 微信开发适配问题
  3. Windows中查找文件被何进程使用
  4. jquery动画 -- 1.加载指示器
  5. 地球化学图解系统GCDPlot 0.33
  6. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第18篇]画一个/描述ECB,CBC,CTR模式的操作
  7. 混合代码块 Markdown Leedcde
  8. Not Equal on a Segment CodeForces - 622C
  9. Java学习笔记13-1——SpringMVC
  10. webview 防止js注入_天台县js聚合物水泥防水涂料的作用