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

QT多线程项目中子线程无法修改主线程的ui组件

情况描述

今天我创建了一个QT多线程的工程,框架如下。我希望通过指针的方式,让子线程去直接修改主线程的ui组件,但事与愿违。

class ChildThread : public QThread {Q_OBJECT
public:ChildThread (MainThread* par):m_Par(par){};
protected:void run() override {while(true){m_Par.ui->label.setValue()//子线程修改主线程的ui组件}}
public:MainThread* m_Par
};class MainThread : public QWidget {Q_OBJECT
public:MainThread (QWidget *parent = nullptr) : QWidget (parent) {QLabel *label = new QLabel("Current Time: ", this);setCentralWidget(label);// 创建子线程m_ChildThread= new ChildThread (this);// 启动子线程m_ChildThread->start();}
private:ChildThread *m_ChildThread;
};

存在的问题:子线程修改主线程ui是不安全操作

在Qt中,GUI相关的操作(例如更新UI元素)通常应该在主线程中执行。直接在子线程中更新UI是不安全的,可能会导致未定义的行为或崩溃。
正确的做法是:利用QT的信号与槽函数机制。在子线程处理完业务后,发出信号并携带上结果给主线程,交给主线程渲染。

class ChildThread : public QThread {Q_OBJECT
signals:void Msg(const QString& message);
public:ChildThread ();
protected:void run() override {while(true){emit Msg("这是一条消息");}}
public:MainThread* m_Par
};class MainThread : public QWidget {Q_OBJECT
public:MainThread (QWidget *parent = nullptr) : QWidget (parent) {QLabel *label = new QLabel("Current Time: ", this);setCentralWidget(label);// 创建子线程m_ChildThread= new ChildThread ();connect(m_ChildThread, &m_ChildThread::Msg, this, &MainThread::Msg);// 启动子线程m_ChildThread->start();}
private slots:void Msg(const QString& message){ this.label.setText(message); }
private:ChildThread *m_ChildThread;
};

这里要注意两点:
1、信号携带的数据要和槽函数接受的数据保持一致,变量名可以不一样。

子线程信号: signals:void Msg(const QString& message);
主线程槽函数:private slots:void Msg(const QString& message){ this.label.setText(message); }

2、信号与槽函数链接,如果官方的链接方式无效果,就换成直接引用。

方式一 connect(m_ChildThread, SINGAL(m_ChildThread::Msg), this, SLOT(&MainThread::Msg));
方式二 connect(m_ChildThread, &m_ChildThread::Msg, this, &MainThread::Msg);

相关文章:

QT多线程项目中子线程无法修改主线程的ui组件

情况描述 今天我创建了一个QT多线程的工程,框架如下。我希望通过指针的方式,让子线程去直接修改主线程的ui组件,但事与愿违。 class ChildThread : public QThread {Q_OBJECT public:ChildThread (MainThread* par):m_Par(par){}; protecte…...

Python 如何实现备忘录设计模式?什么是备忘录设计模式?Python 备忘录设计模式示例代码

什么是备忘录(Memento)设计模式? 备忘录(Memento)设计模式是一种行为型设计模式,用于捕获一个对象的内部状态,并在对象之外保存这个状态,以便在需要时恢复对象到先前的状态。这种模…...

LangChain 代理 Agent(学习笔记)

原文:LangChain 代理 Agent(学习笔记) - 尘叶心繁的专栏 - TNBLOG LangChain 代理 Agent(学习笔记) LangChain 代理 Agent(学习笔记) 简介Agent Zero-shot ReActStructured Input ReActOpenAI FunctionsConversationalSelf ask with searchReAct document storePlan…...

实验三 页面置换算法

一. 实验目的: 1、熟悉虚存管理的各种页面淘汰算法 二、实验环境: 硬件环境:计算机一台,局域网环境; 软件环境:Windows XP及以上版本 Professional操作系统平台,Visual C 6.0专业版或企业版…...

Node.js中的Buffer和Stream

Node.js中的Buffer和Stream 计算机只能理解二进制数据,即0和1形式的数据。这些数据的顺序移动称为流。以称为块(chunk)的破碎部分流式传输数据;计算机一收到数据块就开始处理数据,而不用等待整个数据。 我们这篇文章…...

3.5 Windows驱动开发:应用层与内核层内存映射

在上一篇博文《内核通过PEB得到进程参数》中我们通过使用KeStackAttachProcess附加进程的方式得到了该进程的PEB结构信息,本篇文章同样需要使用进程附加功能,但这次我们将实现一个更加有趣的功能,在某些情况下应用层与内核层需要共享一片内存…...

【小黑送书—第八期】>>别再吐槽大学教材了,来看看这些网友强推的数学神作!

导读:关于大学数学教材的吐槽似乎从来没停止过。有人慨叹:数学教材晦涩难懂。错!难懂,起码还可以读懂。数学教材你根本读不懂;也有人说:数学教材简直就是天书。 数学教材有好有坏,这话不假&…...

MatLab的下载、安装与使用(亲测有效)

1、概述 MatLab是由MathWorks公司开发并发布的,支持线性代数、矩阵运算、绘制函数和数据、信号处理、图像处理以及视频处理等功能。广泛用于算法开发、数据可视化、数据分析以及数值计算等。 Matlab 的主要特性包括: 简单易用的语法,使得程…...

无人智能货柜:引领便捷购物新体验

无人智能货柜:引领便捷购物新体验 无人智能货柜利用人工智能技术,将传统货架与电子商务相结合,形成智能销售终端。其采用先拿货后付款的购物模式,用户只需扫码、拿货、关门三个简洁流畅的步骤,极大地提升了消费者的购物…...

4.6 Windows驱动开发:内核遍历进程VAD结构体

在上一篇文章《内核中实现Dump进程转储》中我们实现了ARK工具的转存功能,本篇文章继续以内存为出发点介绍VAD结构,该结构的全程是Virtual Address Descriptor即虚拟地址描述符,VAD是一个AVL自平衡二叉树,树的每一个节点代表一段虚…...

基于世界杯算法优化概率神经网络PNN的分类预测 - 附代码

基于世界杯算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于世界杯算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于世界杯优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神经网络…...

NPM 与 XUI 共存!Nginx Proxy Manager 搭配 X-UI 实现 Vless+WS+TLS 教程!

之前分享过搭建可以与宝塔共存的一个 “魔法” 服务器状态监控应用 ——xui,支持 VmessWSTLS。 最近 Docker 视频出的比较多,前阵子又出现了宝塔国内版存在隐私泄露的问题,很多小伙伴其实都不用宝塔了,那么,在我们现在…...

【网络奇遇记】那年我与计算机网络的浅相知

🌈个人主页:聆风吟 🔥系列专栏:网络奇遇记、数据结构 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 一. 计算机网络的定义1.1 计算机早期的一个最简单的定义1.2 现阶段计算机网络的一个较好的定义 二. …...

LeetCode26.删除有序数组中的重复项(双指针法)

LeetCode26.删除有序数组中的重复项 1.问题描述2.解题思路3.代码 1.问题描述 给你一个 非严格递增排列 的数组 nums ,请你** 原地** 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然…...

原型网络Prototypical Network的python代码逐行解释,新手小白也可学会!!-----系列8

文章目录 前言一、原始代码二、对每一行代码的解释:总结 前言 这是该系列原型网络的最后一段代码及其详细解释,感谢各位的阅读! 一、原始代码 if __name__ __main__:##载入数据labels_trainData, labels_testData load_data() # labels_…...

黑马点评回顾 redis实现共享session

文章目录 传统session缺点整体访问流程代码实现生成验证码登录 问题具体思路 传统session缺点 传统单体项目一般是把session存入tomcat,但是每个tomcat中都有一份属于自己的session,假设用户第一次访问第一台tomcat,并且把自己的信息存放到第一台服务器…...

Redis篇---第八篇

系列文章目录 文章目录 系列文章目录前言一、说说 Redis 哈希槽的概念?二、Redis 常见性能问题和解决方案有哪些?三、假如 Redis 里面有 1 亿个 key,其中有 10w 个 key 是以某个固定的已知的前缀开头的,如果将它们全部找出来?前言 前些天发现了一个巨牛的人工智能学习网站…...

Unity使用Visual Studio Code 调试

Unity 使用Visual Studio Code 调试C# PackageManager安装Visual Studio EditorVisual Studio Code安装Unity 插件修改Unity配置调试 PackageManager安装Visual Studio Editor 打开 Window->PackageManger卸载 Visual Studio Code Editor ,这个已经被官方废弃安…...

【Linux】进程替换|exec系列函数

文章目录 一、看一看单进程版的进程替换二、进程替换的原理三、多进程版——验证各种程序替换接口exec系列函数execlexeclpexecvexecvp tipsexecleexecve 四、总结 一、看一看单进程版的进程替换 #include<stdio.h> #include<unistd.h> #include<stdlib.h>i…...

Java编程技巧:将图片导出成pdf文件

目录 一、pom依赖二、代码三、测试链接 一、pom依赖 <!-- pdf插件 start --> <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.3</version> </dependency> <dependency…...

终极指南:免费解锁Cursor Pro完整功能,告别AI编程限制

终极指南&#xff1a;免费解锁Cursor Pro完整功能&#xff0c;告别AI编程限制 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reach…...

大模型“语言翻译官“Token深度解析:从人类语言到机器密码的惊险旅程!

本文深入浅出地介绍了大模型如何通过Token&#xff08;词元&#xff09;这一关键组件将人类自然语言翻译成机器能理解的数字密码。文章从Token的来源、生成全过程&#xff08;分词、数字化映射、向量化、矩阵运算、采样解码&#xff09;以及四种主流分词方案&#xff08;BPE、W…...

从MIMO到相控阵:深入浅出聊聊RFSoC的MTS(多片同步)为啥是5G/雷达系统的核心

从MIMO到相控阵&#xff1a;深入浅出聊聊RFSoC的MTS&#xff08;多片同步&#xff09;为啥是5G/雷达系统的核心 在5G Massive MIMO基站的天线阵列背后&#xff0c;或是军用雷达的相控阵天线系统中&#xff0c;数以百计的射频收发通道需要像精密交响乐团般协同工作——任何微小的…...

【实用技巧】-Mac系列设备自定义鼠标指针颜色与动态效果指南

1. 为什么需要自定义鼠标指针&#xff1f; 作为一个用了十年Mac的老用户&#xff0c;我深知默认的白色指针在复杂界面中经常"消失"的烦恼。特别是做设计时&#xff0c;盯着色彩斑斓的PS画布&#xff0c;那个小箭头简直像在玩捉迷藏。更糟的是在演示场景&#xff0c;观…...

AI率降完又反弹原因在这里解决方案也在

论文AI率降到15%&#xff0c;隔了一周再测&#xff0c;又变成了24%。 这个情况不是你的错&#xff0c;也不是工具骗你&#xff0c;而是有几个实际原因导致的。这篇文章解释清楚原因&#xff0c;然后给解决方案。 AI率反弹的3个真实原因 原因一&#xff1a;检测系统更新了 这…...

深度解析:利用pmap+gdb精准诊断Linux进程内存异常

1. 为什么需要pmapgdb组合排查内存问题 第一次遇到线上服务内存爆涨时&#xff0c;我盯着top命令里那个不断攀升的RES数值束手无策。传统的内存监控工具就像医院的体温计&#xff0c;只能告诉你"发烧了"&#xff0c;但查不出具体病因。这就是pmap和gdb这对"黄金…...

如何保证 Session ID 的随机性和不可猜测性?

你的 Session ID 安全吗&#xff1f;—— 从可预测的“门禁卡”到安全的“加密钥匙”1. 引言&#xff1a;一张编号可以被猜到的门禁卡2. Session 与 Session ID&#xff1a;会话的“钥匙”3. 为什么 Session ID 必须随机且不可预测&#xff1f;4. 攻击详解&#xff1a;会话劫持…...

python实现skip-gram(跳词)示例

文章目录示例什么是跳词? 一句话&#xff0c;就是用中心词&#xff0c;去预测它周围的词。它是 Word2Vec 里最常用的一种训练方式。 示例 1、安装依赖 pip install matplotlib # 其他torch等依赖早就安装了2、创建python文件skip_gram_demo.py&#xff0c;代码&#xff1a;…...

告别重复造轮子,用快马平台一键生成OpenClaw高效工具模块

最近在做一个机器人控制项目&#xff0c;需要集成OpenClaw机械爪模块。传统开发方式需要从零开始写大量重复代码&#xff0c;效率很低。后来尝试用InsCode(快马)平台生成核心模块&#xff0c;效果出乎意料的好。这里分享下具体实现思路和优化点&#xff1a; 安全初始化模块设计…...

大模型开发避坑:彻底理清 Skill(技能)与 MCP(模型 上下文协议)的本质区别与协同

在目前的 AI 应用开发圈子里&#xff0c;各种新名词层出不穷&#xff1a;Skill&#xff08;技能&#xff09;、Plugin&#xff08;插件&#xff09;、Function Calling&#xff08;函数调用&#xff09;、Tool&#xff08;工具&#xff09;、MCP&#xff08;模型上下文协议&…...