当前位置: 首页 > news >正文

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

http://www.xdnf.cn/news/1229185.html

相关文章:

  • WinForm之ListBox 控件
  • Qt 槽函数被执行多次,并且使用Qt::UniqueConnection无效【已解决】
  • 电子电气架构 --- 汽车网络安全概述
  • Java高性能编程实践指南
  • cv弹窗,退款确认弹窗
  • Java中Lambda 表达式的解释
  • 【AI】AIService(基本使用与指令定制)
  • 操作系统:远程过程调用( Remote Procedure Call,RPC)
  • 公网服务器上Nginx或者Openresty如何屏蔽IP直接扫描
  • java中的synchronized关键字​
  • 福彩双色球第2025088期篮球号码分析
  • PyTorch 张量核心操作——比较、排序与数据校验
  • 利用DeepSeek将Rust程序的缓冲输出改写为C语言实现提高输出效率
  • 深入 Go 底层原理(十五):cgo 的工作机制与性能开销
  • 探索:Uniapp 安卓热更新
  • 【Android】RecyclerView实现新闻列表布局(1)适配器使用相关问题
  • 原生JS使用svg-pan-zoom库平移和缩放svg
  • 八股取士--docker
  • 【C++】第二十一节—一文详解 | 红黑树实现(规则+效率+结构+插入+查找+验证)
  • Day18--二叉树--530. 二叉搜索树的最小绝对差,501. 二叉搜索树中的众数,236. 二叉树的最近公共祖先
  • 【MQ】kafka同步和异步的区别
  • 函数指针——回调函数
  • MybatisPlus-逻辑删除
  • Redis核心机制与实践深度解析:从持久化到分布式锁
  • 江协科技STM32 13-1 PWR电源控制
  • AG32mcu通过寄存器方式操作cpld
  • 3 使用 Jenkins 构建镜像:将你的应用打包成镜像
  • sqli-labs:Less-18关卡详细解析
  • 【隧道篇 / IPsec】(7.6) ❀ 02. 如何删除向导创建的IPsec安全隧道 (点对点) ❀ FortiGate 防火墙
  • K8S部署ELK(三):部署Elasticsearch搜索引擎