尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Qt5.9版本如何方便在子线程更新Ui
Qt5.10增加QMetaObject::invokeMethod接口lambda的重载使用比较方便。碍于公司使用的依旧是5.9.7版本所以按照Qt5.10的使用方式做一个类似的封装。实现如下classFuncInvoker:publicQObject{public:FuncInvoker(std::functionvoid()func,QObject*parentnullptr):QObject(parent),m_workFunc(std::move(func)){}voidexec(){if(m_workFunc)m_workFunc();deleteLater();}private:std::functionvoid()m_workFunc{nullptr}};classMethodInvoker{public:templatetypenameFuncstaticvoidinvokeAsync(QObject*obj,Funcfunc,Qt::ConnectionType typeQt::QueuedConnection){FuncInvoker*invokernewFuncInvoker(obj);if(invoker-thread()!obj-thread())invoker-moveToThread(obj-thread());QMetaObject::invokeMethod(invoker,exec,type);}};///////////////////////////////////////////////////classFuncInvoker:publicQObject{Q_OBJECTpublic:templatetypenameFuncexplicitFuncInvoker(Funcfunc,QObject*parentnullptr):QObject(parent),m_workFunc(std::forwardFunc(func)){}Q_INVOKABLEvoidexec(){autofstd::move(m_workFunc);// 先取走保证异常安全 幂等m_workFuncnullptr;if(f)f();deleteLater();}private:std::functionvoid()m_workFunc;};classMethodInvoker{public:templatetypenameFuncstaticvoidinvokeAsync(QObject*context,Funcfunc,Qt::ConnectionType typeQt::QueuedConnection){Q_ASSERT(context);// 关键点 1不要挂 parent否则 moveToThread 会失败auto*invokernewFuncInvoker(std::forwardFunc(func));// 关键点 2把 invoker 移动到目标对象所属线程if(invoker-thread()!context-thread())invoker-moveToThread(context-thread());// 关键点 3context 销毁时顺手清理 invoker防泄漏QObject::connect(context,QObject::destroyed,invoker,QObject::deleteLater,Qt::DirectConnection);// 关键点 4投递失败要兜底回收constboolokQMetaObject::invokeMethod(invoker,exec,type);if(!ok)invoker-deleteLater();}};//使用// 子线程里MethodInvoker::invokeAsync(uiWidget,[]{uiWidget-setText(done);// 这里已经跑在 UI 线程});
RELATED

相关推荐

UE5.6/5.7 MetaHuman C++编译报错排查:模块依赖与版本匹配实战指南

UE5.6/5.7 MetaHuman C++编译报错排查:模块依赖与版本匹配实战指南

说实话,第一次在 UE5.6 上往项目里接 MetaHuman 的时候,我差点被编译报错劝退。明明代码逻辑还没怎么写,构建输出窗口里先堆了三四十条红色错误,扫一眼全是跟 MetaHumanSDK、ControlRig、RigLogic 相关的头文件找不到、符号无法解…

📅 2026/10/15 6:58:00
一条SQL在MySQL中的完整旅程:从连接到存储引擎的执行链路解析

一条SQL在MySQL中的完整旅程:从连接到存储引擎的执行链路解析

1. 一条SQL查询的完整旅程:从输入到结果1.1 一条再普通不过的SQL,背后发生了什么?先抛出一个场景:你在客户端敲下这么一行语句:select * from user where id 1;回车之后,短短几十毫秒,结果就回…

📅 2026/10/15 6:58:00
浓度迁移结合损伤方程:扩散-应力-损伤双向耦合模拟的工程实践

浓度迁移结合损伤方程:扩散-应力-损伤双向耦合模拟的工程实践

有一阵子我一直在做电极颗粒在充放电过程中的浓度迁移模拟,模型越做越细,越觉得“浓度迁移结合损伤方程”这几个字没那么简单。最早我习惯把扩散和开裂拆成两步走:先算出锂离子浓度场,再把浓度梯度转成应力,拿最大主应…

📅 2026/10/15 6:58:00
MORE NEWS

更多资讯

📰

用电器分析识别装置:电流波形特征提取与分类器实战

简介:这份PDF是2021年全国大学生电子设计竞赛本科组H题「用电器分析识别装置」的完整赛题文档,面向备战电赛的高校学生与指导教师,帮助读者快速掌握题目任务、指标约束与评分细则。资源包共1个PDF文件,约315KB,内容为官…

📰

第190篇 Messenger 与 AIDL 对比:轻量 IPC 的选择

先把结论放在前面:Messenger 是对 AIDL 的二次封装——它把"一次 RPC 调用"换成"往对方的 Handler 队列里塞一条 Message",用队列换来了串行语义与天然的任务隔离。 因此判断标准只有一条:低频、单向、不需要即时返回值的命令或回传用 Messenger;需要返…

📰

Java集合核心解析:从Collection到List/Set/Queue的底层原理与选型

很多Java开发者最开始接触Collection,脑子里只有一句话:这就是个装数据的容器。直到某天线上出问题——往Set里塞同一个自定义对象竟然塞进去了两个,或者一边遍历一边删元素删到ConcurrentModificationException,才发现这个“容器…

📰

建造堡垒,征伐巨龙 | 用这大屏打开《符文世界:龙之荒野》

9 月 15 日,《符文世界:龙之荒野》1.0 正式版上线,首发同步加入 XGP。作为《RuneScape》系列 25 年来首次登陆主机平台的作品,它将经典符文世界观与生存建造玩法融为一体,在烬落之地上,开启一场探索、建造、…

📰

ArtCraft:面向量产的结构化创意生产方法论

1. 项目概述:ArtCraft 不是“艺术手作”的简单拼贴,而是一套可落地的创意生产方法论ArtCraft 这个词乍看像英文单词 art(艺术)和 craft(工艺/手作)的合成词,很容易被理解成“艺术手作”“创意DI…

📰

2027创新选题:基于AI睡眠分期与数字梦境干预的“眠界”智能睡眠管理系统设计与实现

1. 项目背景与痛点 2027年,全球睡眠障碍人群预计突破 12亿,中国失眠人群占比高达 38.2%。褪黑素滥用、助眠产品泛滥、睡眠数据碎片化等问题日益严重。与此同时,梦境的神经机制逐步被解析,数字梦境干预成为睡眠科技的前沿方向。痛点…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬