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

Qt不能在线程函数操作UI

  Qt的官方文档虽然并没有明确说明,不能在子线程中操作UI,但是,因为Qt是事件循环机制,所有的UI事件都是在主线程中处理的,如果在子线程中直接操作UI,就会存在线程安全问题,严重时候会使程序挂掉。
  但是有些场景确实需要在子线程中操作UI怎么办?以下是几种常用的解决方案:
  1. 使用信号槽机制
  这种方式是当子线程中需要对ui对象进行操作时,发出一个信号,在与之连接的槽中处理ui操作。信号和槽的连接方式必须是BlockingQueuedConnection 或QueuedConnection 的连接方式连接。
  2. 使用自定义event
  在子线程中通过QCoreApplication::postEvent 发出自定义的event,在对应的ui对象中重写customevent中处理自定义的event 。
  3. 使用QMetaObject::invokeMethod()函数
  该函数是一个静态函数,可以直接使用,用于调用对象的元对象方法 。该函数功能很强大,这里是用到了其可以在不同线程之间调用对象方法的特性。

  如果是新代码,可以在程序设计之初就处理好子线程与UI操作之间的协调处理,这种情况比较好办,可以使用方法1和方法2进行处理。但是如果是维护历史代码,重新做设计肯定是不现实的,所以就需要使用方法3进行处理,在子线程中操作UI的代码段,修改为QMetaObject::invokeMethod函数调用,可以做到最小程度的代码修改,下面给出具体例子:

// 在子线程中调用
int rowCount = 0;
REPORT_DE_INFO reportInfo;
bool b = QMetaObject::invokeMethod(this, "initTablewidget", Qt::BlockingQueuedConnection, Q_RETURN_ARG(int, rowCount), Q_ARG(REPORT_DE_INFO&, reportInfo));

  参数说明:
   参数1:调用对象指针
   参数2:调用的方法名
   参数3:连接方式,与信号槽连接函数connect的最后一个参数相同。对于这里是维护历史代码的场景,建议使用BlockingQueuedConnection,原来代码的执行逻辑一定是先执行完函数后才继续往下走,如果这里不给阻塞住,函数还没执行完,子线程就会继续往下走,很显然这与原来的代码逻辑并不相同,很可能会出现错误
   参数4:Q_RETURN_ARG宏,用来接收函数的返回值,宏的第1个参数是返回值类型,第2个参数是接收返回值的变量名
   参数5:Q_ARG宏,用来向函数传递参数,宏的第1个参数是函数参数的类型,第2个参数是传递参数的变量名,如果函数有多个参数,可以继续往下使用Q_ARG宏来传递
   返回值:bool类型,执行成功或者失败
   注意:执行的函数一定要是槽函数,否者回执行失败

http://www.lryc.cn/news/265313.html

相关文章:

  • web网页端使用webSocket实现语音通话功能(SpringBoot+VUE)
  • 读取spring boot项目resource目录下的文件
  • R语言生物群落(生态)数据统计分析与绘图实践技术
  • c# OpenCV 检测(斑点检测、边缘检测、轮廓检测)(五)
  • PHP下载安装以及基本配置
  • 黑苹果安装经验总结2023-12
  • 基于深度学习的森林火焰烟雾检测系统(含UI界面,yolov8、Python代码,数据集)
  • 测试开发体系介绍——测试体系介绍-L1
  • Linux中的链接运算符详解 - 提高编程效率与性能
  • JS模块化规范之ES6及UMD
  • XM平台官网开户注册流程图解
  • 【Linux进阶之路】线程
  • 个性化TikTok外贸工具定制!突破营销新境界!
  • 设计模式-门面模式
  • 搭建接口自动化测试框架python+requests+pytest
  • 一套rk3588 rtsp服务器推流的 github 方案及记录 -02
  • docker运行java程序的Dockerfile
  • docker数据卷数据卷容器
  • 使用HTTP协议有哪些风险?HTTP与HTTPS的区别是什么
  • 【jvm从入门到实战】(十) 实战篇-内存调优
  • 设计模式分类
  • 【前缀和】【单调栈】LeetCode2281:巫师的总力量和
  • 力扣面试经典题之二叉树
  • 图灵日记之java奇妙历险记--数据类型与变量运算符
  • PhysX——源码编译
  • 小鹅通基于 TSE 云原生 API 网关的落地实践
  • Postgresql处理JSON类型中替换某个属性值问题
  • @德人合科技——天锐绿盾 | 图纸加密软件有哪些功能呢?
  • android 使用GSON 序列化对象出现字段被优化问题解决方案
  • 进入不了Bios?进入Bios的方法都在这了,肯定能进!