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

记录 Qt 跨线程 信号无法触发槽函数问题

Qt项目中多线程通信时 使用connect 连接了两个线程中的信号与槽,槽函数触发不了:

// MainWindow.cpp
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {// 创建线程和串口管理器m_serialThread = new QThread(this);m_serialManager = new SerialManager();// 将对象移动到子线程m_serialManager->moveToThread(m_serialThread);// 连接信号槽,明确指定队列连接connect(m_serialManager, &SerialManager::portsRefreshed,this, &MainWindow::onPortsRefreshed, Qt::QueuedConnection);// 启动线程m_serialThread->start();}

比如上面这样的代码,要通过SerialManager中的信号 触发当前类中的槽函数 onPortsRefreshed;结果就是一直触发不了,上网搜了一下以及问了一下AI,各种原因以及办法试了好久最终解决。

我的问题在于 信号与槽的传递的参数格式非常规,用的是Qt本身的源文件中的QSerialPortInfo类 但是这个类不在标准传参类型之中。

所以有两种解决办法:1.在发出信号之前把需要传递的信息转化为常规类型 比如QString 或者 QVector等,然后用这些类型作为参数;2.使用自定义/非常规类型的参数之前先注册一下比如:

// 自定义类型
struct CustomData {int id;QString name;
};
Q_DECLARE_METATYPE(CustomData)// 在使用前注册
qRegisterMetaType<CustomData>("CustomData");// 信号声明
signals:void customSignal(const CustomData &data);

还有一些其他的原因会导致槽无法触发:比如线程未启动需要调用 thread->start()函数;connect 后面参数未指定 Qt::QueuedConnection ;局部对象生命周期随函数结束的; 还有movetoThread的类无事件循环的(这种情况可能有点复杂)等 

http://www.dtcms.com/a/423956.html

相关文章:

  • wireshark 01——安装
  • 网上最好购物网站邯郸网上销售公司
  • 使用top域名做网站seo职位是什么意思
  • CUDIS 健康协议在 Sui 上打造更健康的未来
  • 装修网站排行榜前十名有哪些南昌网站建设哪家最好
  • Golang学习笔记:context的使用场景
  • 带有客户案例的网站广州专业网站建设报价
  • 昆明微信网站建设软件开发模型有几种并简述其特点
  • 高效实现实体删除的宏解决方案:使用Rust宏优化删除操作
  • Rust泛型详解
  • 官方手表网站网站专题分类
  • 新乡网站建设方案搜狗网址大全下载安装
  • 关于可视化卷积核和特征图的深度理解
  • 【mysql】Mybatisplus BINARY {0} LIKE CONCAT(‘%‘, {1}, ‘%‘)写这句话是什么意思
  • 开发避坑指南(59):Vue3中高效删除数组元素的方法
  • wordpress建站要用模板吗wordpress搜索筛选
  • 安卓 WPS Office v18.21.0 国际版
  • 衡阳网站推广优化公司行业网站开发运营方案
  • 临海房产中介网站如何制作网站平台管理
  • 做网站多少人建e室内设计网官网平面图
  • git mere 错误后的回滚处理
  • Java开发入门(一)--- JDK与环境变量配置
  • 最好的营销型网站建设公司报电子商务(网站建设与运营)
  • 从0到1制作一个go语言游戏服务器(二)web服务搭建
  • 网站使用流程图昆明网站建设天锐科技
  • (uniapp)基于vue3父子组件间传递参数与方法
  • 铁岭开原网站建设高中课程免费教学网站
  • 高校网站群建设方案网站建设目录结构设计
  • 静态网站源码野花韩国视频在线观看免费高清
  • Windows下NVM保姆级指南:安装、切换版本、指定路径+淘宝镜像配置,一次搞定!