Qt 信号和槽正常连接返回true,但发送信号后槽函数无响应问题【已解决】
Qt 信号和槽正常连接返回true,但发送信号后槽函数无响应问题
- 引言
- 一、问题描述及解决方案
- 1.1 问题描述
- 1.2 解决方案
- 二、Q_DECLARE_METATYPE 和 qRegisterMetaType
引言
Qt的信号和槽机制是一种用于对象间通信的松耦合方式。信号在特定事件发生时被发射,槽是响应信号的函数。这种机制替代了传统的回调函数,提供了更高的灵活性和类型安全。
Qt 信号与槽的使用详解 - 多种绑定形式、同步异步、Lambda表达式等:https://blog.csdn.net/qq_38204686/article/details/139702275
一、问题描述及解决方案
1.1 问题描述
使用Qt5
,connect函数返回值为true
- 因为是跨线程,使用
Qt::QueuedConnection
连接,槽函数不响应信号,改为Qt::BlockingQueuedConnection
后可正常响应
1.2 解决方案
- connect之前使用
qRegisterMetaType<xxx>("xxx");
注册信号和槽函数的参数类型。
因为程序没有报这个:Make sure 'xxx' is registered using qRegisterMetaType()
,所以没有考虑注册问题。之前遇到过类似的问题程序会打印以上信息提示,不知道为什么这次没有。找到一篇类似问题的博客,解释了Qt::BlockingQueuedConnection
为什么可以:
Qt信号槽函数没有响应问题:https://blog.csdn.net/cheriyou_/article/details/136480462 - 参数类型为uint16_t也需要注册 (
typedefine的类型也是自定义的数据类型
)
- 参考博文:
qt多线程编程,信号绑定成功,槽函数不响应问题排查处理及总结:https://blog.csdn.net/skyloveka/article/details/133853533
Qt次线程向主程序发送信号收不到的问题:https://blog.csdn.net/danshiming/article/details/124696536
槽函数收不到信号问题(信号的注册):https://blog.csdn.net/weixin_43197380/article/details/146248443
二、Q_DECLARE_METATYPE 和 qRegisterMetaType
Q_DECLARE_METATYPE
是一个宏,用于声明自定义类型可以被 Qt 的元对象系统识别。它通常在类的头文件中使用,告知 Qt 该类型的名称和结构,使其能够用于信号槽跨线程通信、QVariant 存储等场景。但仅声明不会自动注册到运行时类型系统中。qRegisterMetaType
是一个运行时函数,用于将类型注册到 Qt 的元对象系统中。它必须在程序运行时调用(如 main() 函数或类静态初始化块中),确保类型信息可用于动态操作(如信号槽跨线程传递)。
Q_DECLARE_METATYPE
适用于需要用QVariant
的存储和转换。需要通过信号槽跨线程传递,或者需要与 QObject::property() 或 QML 交互,必须使用qRegisterMetaType
。