QT在子线程中更新UI界面

在Qt中,直接从子线程更新UI是不安全的,因为Qt的UI组件通常不是线程安全的。这意味着,如果你尝试在子线程中直接调用UI组件的方法,可能会导致程序崩溃或者不可预测的行为。为了安全地从子线程更新UI,Qt提供了几种机制:

信号和槽(Signals and Slots)
信号和槽是Qt中用于对象间通信的机制,它们可以用来在不同线程之间发送信息。当你需要从子线程更新UI时,可以创建一个信号,然后在子线程中发出这个信号。UI线程(主线程)连接这个信号,并在接收到信号时执行槽函数来更新UI。
在这里插入图片描述

mainwindow.h
主要是定义了2个槽,一个是自动生成的按钮点击后的槽,一个是新建接收子线程信号的槽;私有了子线程的变量

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include "utils.h"QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void on_pushButton_clicked();public slots:void inc_num();private:Ui::MainWindow *ui;Utils *utils;
};
#endif // MAINWINDOW_H

mainwindow.cpp
绑定了信号与槽,并且在定义的两个槽中实现了逻辑

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow){//实例化子类, 并把子类的生命周期绑定到主类上utils = new Utils(this);//绑定信号与槽,utils是子线程,this绑定的就是当前主线程connect(utils,&Utils::send_inc_num,this,&MainWindow::inc_num);ui->setupUi(this);
}MainWindow::~MainWindow(){delete ui;
}//按钮点击的槽
void MainWindow::on_pushButton_clicked(){//调用子线程的方法utils->incNum();
}//接收send_inc_num信号的槽
void MainWindow::inc_num(){int num = ui->lineEdit->text().toInt()+1;ui->lineEdit->setText(QString::number(num));
}

utils.h
定义了信号

#ifndef UTILS_H
#define UTILS_H
#include <QObject>
#include <QDebug>class Utils  : public QObject{Q_OBJECTsignals:void send_inc_num();public:Utils(QObject *parent = nullptr);void incNum();};#endif // UTILS_H

utils.cpp
子线程接收到主线程的调用后发送了信号

#include "utils.h"Utils::Utils(QObject *parent) : QObject(parent){}//发送信号
void Utils::incNum(){send_inc_num();
}

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

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

相关文章

中国电子学会科学技术奖公布,腾讯、北京大学、北京科技大学联合项目获一等奖

3月26日记者获悉&#xff0c;中国电子学会公布科学技术奖获奖名单&#xff0c;由腾讯主导&#xff0c;北京大学、北京科技大学共同参与的联合项目《面向大规模数据的Angel机器学习平台关键技术及应用》获科技进步一等奖。 Angel机器学习平台是支撑腾讯混元大模型的核心技术&am…

c++初步

作业&#xff1a; 定义自己的命名空间&#xff0c;其中有string类型的变量&#xff0c;再定义两个函数&#xff0c;一个函数完成字符串的输入&#xff0c;一个函数完成求字符串长度&#xff0c;再定义一个全局函数完成对该字符串的反转 #include <iostream> #include &…

Linux的学习之路:1、发展史与编译环境的搭建

一、发展史 1991年10月5日&#xff0c;赫尔辛基大学的一名研究生Linus Benedict Torvalds在一个Usenet新闻组 &#xff08;comp.os.minix&#xff09;中宣布他编制出了一种类似UNIX的小操作系统&#xff0c;叫Linux。新的操作系统是受到另一个UNIX的小操作系统——Minix的启发…

蓝桥杯2023真题-幸运数字

目录 进制转换&#xff1a; 思路 代码 题目链接&#xff1a; 0幸运数字 - 蓝桥云课 (lanqiao.cn) 本题就考的进制转换问题&#xff0c;要将十进制5转换成二进制&#xff0c;通过%2,和/2的交替使用即可完成&#xff0c;所得余数就是转换成的二进制各位的值&#xff0c;转换…

【贪心】【分类讨论】2499. 让数组不相等的最小总代价

作者推荐 视频算法专题 本文涉及知识点 贪心 分类讨论 LeetCode2499. 让数组不相等的最小总代价 给你两个下标从 0 开始的整数数组 nums1 和 nums2 &#xff0c;两者长度都为 n 。 每次操作中&#xff0c;你可以选择交换 nums1 中任意两个下标处的值。操作的 开销 为两个下…

只需一周,拿下自动化测试(全)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、自动化测试 在软件测试中&#xff0c;自动化测试指的是使用独立于待测软件的其他软件来自动…

ServletConfig和ServletContext

ServletConfig接口 在Servlet运行期间&#xff0c;需要一些配置信息&#xff0c;这些信息都可以在WebServlet注解的属性中配置。当Tomcat初始化一个Servlet时&#xff0c;会将该Servlet的配置信息封装到一个ServletConfig对象中&#xff0c;通过调用init(ServletConfig config…

[Vue warn]: Invalid vnode type when creating vnode: false

如题&#xff0c;意思是创建vnode时&#xff0c;vnode类型无效:false。 根据右边的索引点进去&#xff0c;发现定位的是组件loading。搜索loading发现声明了变量loading&#xff0c;更改后问题消失。

CVE-2022-33891 Apache Spark shell 命令注入漏洞分析

漏洞简介 Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎。Spark是UC Berkeley AMP lab (加州大学伯克利分校的AMP实验室)所开源的类Hadoop MapReduce的通用并行框架 Spark&#xff0c;拥有Hadoop MapReduce所具有的优点&#xff1b;但不同于MapReduce的…

awk指定输入分隔符,输出分隔符

awk -v FS -v OFS, {print $1,$2} a.txt FS &#xff0c;指定输入分割符为 OFS,&#xff0c;指定输出分割符为, 效果

【C++】隐藏的this指针

文章目录 1.this指针的引出2.this指针的特性 1.this指针的引出 我们通过日期类来学习this指针&#xff0c;首先我们先定义一个日期类。 class Date { public:void Display(){cout << _year << "-" << _month << "-" << _d…

ubuntu2004自动更新内核导致nvidia驱动无法正常启动的问题

症状 开机后&#xff0c;nvidia-smi无法正常显示显卡状态&#xff0c;另外无法连接多个显示屏 解决 参考这个文章&#xff1a; ls /usr/src可以看到已安装的nvidia驱动版本是nvidia-535.54.03 然后运行下面的指令&#xff1a; sudo apt-get install dkmssudo dkms instal…