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);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/150786.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是美颜SDK?直播美颜SDK技术深度剖析

在实现实时美颜的过程中,美颜SDK扮演着关键的角色,它为开发者提供了一套强大的工具,使得实时美颜效果能够轻松应用于直播平台。 一、美颜SDK的基本概念 美颜SDK是一种软件工具包,通过集成了丰富的图像处理算法和实时计算技术&a…

mysql使用--子查询

1.标量子查询 将一个查询结果集中只含一行,行中只有一列的结果集称为标量结果集。 标量结果集可以作为数值参与到另一个查询中。 如:SELECT * FROM student_score WHERE number (SELECT number FROM student_info WHERE name ‘狗哥’); 2.列子查询 将…

springboot使用MongoTemplate根据正则表达式查询日期数据

一、日期正则表达式测试 匹配HH:mm:ss正则表达式写法有很多列举两个 .(点)代表任意匹配 ^必须以xxx开头, 如^[a-z],必须以a-z的字母开头 : 精确匹配,必须是: ([0-1]?[0-9]|2[0-3]).([0-5][0-9]).([0-5][0-9]) ^([0-1]?[0-9]|2[0-3]).([0-5][0-9]).([0-5][0-9])$ ([0-1]?…

MIUI查看当前手机电池容量

MIUI查看当前手机电池容量 1. 按如下步骤操作生成bug报告 2. 按如下操作解压bug报告 Last learned battery capacity

BLE协议栈入门学习

蓝牙LE栈 物理层 频带 蓝牙LE在2400MHz到2483.5MHz范围内的2.4GHz免授权频段工作,该频段分为40个信道,每个信道间隔为2MHz。 时分 蓝牙LE是半双工的,可以发送和接收,但不能同时发送和接收,然而,所有的设…

产品经理必须知道的电商API接口对接流程注意事项

接口对接流程梳理 产品经理 知晓自己负责系统做什么,外接三方系统做什么。 系统对接产品经理实操步骤: ①与公司业务人员沟通,与系统对接方产品/技术描述业务场景,沟通发放接口文档材料 ②拿到材料之后电商API接口过多请对方…

牛客剑指offer刷题动态规划篇

文章目录 连续子数组的最大和题目思路代码实现 连续子数组的最大和(二)题目思路代码实现 连续子数组的最大和 题目 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组…

【测试功能篇 01】Jmeter 压测接口最大并发量、吞吐量、TPS

压力测试,我们针对比较关键的接口,可以进行相应的压力测试,主要还是测试看看接口能抗住多少的请求数,TPS稳定在多少,也就是吞吐量多少 安装 Jmeter的安装很简单,官网下载地址 http://jmeter.apache.org/ &…

day30_servlet

今日内容 零、复习昨日 一、接收请求 二、处理响应 三、综合案例 零、复习昨日 画图, 请求处理的完整流程(javaweb开发流程) 零、注解改造 WebServlet注解,相当于是在web.xml中配置的servlet映射 Servlet类 package com.qf.servlet;import javax.servlet.ServletException; im…

HTML5学习系列之音频和视频

HTML5学习系列之音频和视频 前言音频和视频embedobjectaudiovideo 总结 前言 学习记录。 音频和视频 embed embed定义嵌入插件。 src:指定来源height:高度type:内容的类型width:内容的宽度 object 定义一个嵌入的对象 data…

HTML5学习系列之项目实战1

HTML5学习系列之项目实战1 前言代码记录问题总结 前言 学习记录 代码 <div id"player"><audio id"musicbox"></audio><div id"controls" class"clearfix controls"><div id"play" class"…

关于代码混淆,看这篇就够了

​ 代码混淆一.基本概念java的bytecode很容易通过JAD等反编译工具还原出源代码。这样势必不满足安全的定义。如何一定程度上保护需要防止被反编译的源代码呢&#xff1f;混淆&#xff08;obfuscate&#xff09;技术。注意&#xff1a;用obfuscate防盗版是根本不可能&#xff0c…

软考的含金量如何?怎么备考?

软考的含金量&#xff0c;太香了&#xff01; 一张软考证书可以抵扣个税&#xff0c;一次性抵扣3600元个税&#xff1b; 一张软考证书可以帮助省去大额的中介费&#xff0c;在一线城市直接职称入户&#xff1b; 一张软考证书可以在招投标中加分&#xff0c;为企业增加中标的…

代码随想录算法训练营第五十八天丨 单调栈01

739. 每日温度 思路 首先想到的当然是暴力解法&#xff0c;两层for循环&#xff0c;把至少需要等待的天数就搜出来了。时间复杂度是O(n^2) 那么接下来在来看看使用单调栈的解法。 什么时候用单调栈呢&#xff1f; 通常是一维数组&#xff0c;要寻找任一个元素的右边或者左边…

HTTP Header 参数详解

关于HTTP消息头 HTTP消息头是在&#xff0c;客户端请求&#xff08;Request&#xff09;或服务器响应&#xff08;Response&#xff09;时传递的&#xff0c;位请求或响应的第一行&#xff0c;HTTP消息体&#xff08;请求或响应的内容&#xff09;是其后传输。HTTP消息头&…

MySQL 的执行原理(二)

5.3. MySQL 的查询成本 5.3. MySQL 的查询成本 MySQL 执行一个查询可以有不同的执行方案&#xff0c;它会选择其中成本最低&#xff0c;或者 说代价最低的那种方案去真正的执行查询。不过我们之前对成本的描述是非常模 糊的&#xff0c;其实在 MySQL 中一条查询语句的执行成本…

golang学习笔记——fmt.Printf()、fmt.Print() 和 fmt.Println()区别

fmt.Printf()、fmt.Print() 和 fmt.Println()区别 fmt.Printf(), fmt.Print() 和 fmt.Println() 这三个函数都是 Go 语言标准库 fmt 中的函数&#xff0c;它们都可以用于在控制台输出文本。但是它们之间存在一些重要的区别&#xff1a; fmt.Printf()&#xff1a;这个函数的名…

Cmake学习

cmake大致 cmake_minimum_required(VERSION 3.0)project(test) #通过set自定义变量&#xff0c;通过${}取出 #set(SRC add.cpp main.cpp muti.cpp sub.cpp) #cmake搜索文件 宏定义PROJECT_SOURCE_DIR aux_source_directory(${PROJECT_SOURCE_DIR} SRC) #file(GLOB/GLOB_RECURSE…

静态文件鉴权

​ 静态文件鉴权的解决方案 背景介绍 XX业务系统作为BXX业务系统的孪生姐妹系统&#xff0c;是对BXX受理业务的强力补充系统&#xff0c;他允许操作员拿着IPAD&#xff0c;和客户约定地点上门受理业务。 因一些业务的受理&#xff0c;按照最新的业务规章制度&#xff0c;需…

常用 API 异常

常用 API & 异常 对之前那篇 API 文章的补充学习 1.API 1.1 API概述【理解】 什么是API ​ API (Application Programming Interface) &#xff1a;应用程序编程接口 java中的API ​ 指的就是 JDK 中提供的各种功能的 Java类&#xff0c;这些类将底层的实现封装了起来&am…