【Qt开发经验】Qt信号槽连接不成功问题原因汇总
以下几种情况会导致信号槽连接不成功,下面分别描述。
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信号槽连接不成功问题原因汇总相关推荐
- Qt——P13 Q4版本信号槽连接
widget.cpp #include "widget.h" #include "ui_widget.h" #include <QPushButton&g ...
- QT C++ 《信号-槽 基本操作》
目录 <信号-槽 基本操作> 信号-槽连接 信号-槽断开连接 信号-槽连接 connect(ui.pushButton_SIGNAL, SIGNAL(clicked()), Client_ ...
- Qt线程间信号槽传递自定义数据类型(qRegisterMetaType的使用)
Qt线程间信号槽传递自定义数据类型(qRegisterMetaType的使用) #include <QMetaType> CFileDataModel::CFileDataModel(QO ...
- Qt / Moc 和信号 - 槽解析
目录 一. MOC 二. moc_test.cpp 分析 三. connect 四. activate 五. 总结 版本 Qt5.12.3 moc_test.cpp 位于可执行文件目录下,其余源代码都 ...
- Qt多线程间信号槽传递非QObject类型对象的参数
一.以前就发现过这个问题: 在Qt项目中,有时候为了让自己的类,可以重载操作符 '=','<<','>>'. 也有时候需要用一个类进行文件的读写,所以很多C++类还是要简单化的 ...
- 玩转Qt(6)-认清信号槽的本质
简介 猫和老鼠的故事 对象之间的通信机制 尝试一:直接调用 尝试二:回调函数+映射表 观察者模式 Qt的信号-槽 信号-槽简介 信号-槽分两种 信号-槽的实现 元对象编译器moc moc的本质-反射 ...
- QT:PushButton+信号槽+Label简单使用
实现内容 创建一个简单的QT GUI项目,实现点击按钮修改Label的内容 创建QT GUI 项目:ButtonTest 创建后的目录为: 添加界面布局 在界面添加两个PushButton和一个Lab ...
- Qt学习笔记-----信号槽
Qt提供signals and slots mechanism(信号槽机制)来保证两个对象之前的关联(connection). 所谓信号槽,简单理解就是两部分,一个是某对象发出的信号,一个是某对象接收 ...
- Qt中绑定信号槽之后,信号槽无效
下面程序编译没有错误,运行却未达到想要的效果,最后调试发现,是信号槽绑定后无效,即槽函数没有受到信号的触发.具体代码如下: main.cpp #include <QtCore> #incl ...
最新文章
- linux docker 目录挂载映射
- python如何编写excel_如何用Python编写Excel
- flutter怎么手动刷新_flutter局部刷新的实现示例
- acm java_ACM Java Native SDK 概述
- linux目录删除不释放空间,删除linux文件后,磁盘空间未释放的解决办法
- dataoutputstream.write 有时无法发送_RTK实操——CORS官方网教您如何解决RTK无法固定的问题...
- 软件工程结构化建模的方法和工具_软件工程导论知识点梳理之概念题
- Mybatis(17)注解方式增删改查单表
- java线程池1001java线程池_深入浅出Java(Android )线程池ThreadPoolExecutor
- 面向未来 “亿”触即发-中科曙光技术创新大会重磅发布多项创新举措与成果...
- innodb 索引 mysql_InnoDB索引实现
- jquery怎么选择 某个指定id的div下面的第2个子div再设置css?
- 卡方检验与方差分析的区别
- 2021-07-19支付宝扫码点餐推广怎么做(干货来了)
- LIN雨量传感器:MQB平台与PQ自带的传感器类型分析
- C语言刷题随记 —— 国际象棋棋盘
- java 设置纸张大小设置_java 用itext设置pdf纸张大小操作
- mnist数据集百度云链接
- Lytro In Matlab
- 复星金服微服务_复星金控携手医伴金服加快医疗金融布局
热门文章
- 怎样使用两行代码实现博客园打赏功能
- webapp 微信开发适配问题
- Windows中查找文件被何进程使用
- jquery动画 -- 1.加载指示器
- 地球化学图解系统GCDPlot 0.33
- [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第18篇]画一个/描述ECB,CBC,CTR模式的操作
- 混合代码块 Markdown Leedcde
- Not Equal on a Segment CodeForces - 622C
- Java学习笔记13-1——SpringMVC
- webview 防止js注入_天台县js聚合物水泥防水涂料的作用