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

做一视频网站湖南网站建设有限公司

做一视频网站,湖南网站建设有限公司,化工集团网站建设 中企动力,天美影像传媒有限公司招聘Qt中在子线程中刷新UI的方法 在Qt中UI界面并不是线程安全的,意味着在子线程中不能随意操作UI界面组件(比如按钮、标签)等,如果强行操作这些组件有可能会导致程序崩溃。那么在Qt中如何在子线程中刷新UI控件呢? 两种方…

Qt中在子线程中刷新UI的方法

在Qt中UI界面并不是线程安全的,意味着在子线程中不能随意操作UI界面组件(比如按钮、标签)等,如果强行操作这些组件有可能会导致程序崩溃。那么在Qt中如何在子线程中刷新UI控件呢?

两种方法:

方法一:使用信号槽机制。

第一步:创建一个QWidget项目,并且在其中添加一个继承自QThread的子线程类QWorkThread,如下:

#ifndef QWORKTHREAD_H
#define QWORKTHREAD_H#include <QObject>
#include<QThread>class QWorkThread : public QThread
{Q_OBJECT
public:explicit QWorkThread(QThread *parent = nullptr);QWorkThread(QWidget* pWidget,QThread *parent = nullptr);QWidget* m_pWidget = nullptr;protected:virtual void run() override;signals:void UpdateUI(QString strInfo);
};#endif // QWORKTHREAD_H

说明:

1.自定义一个信号UpdateUI用来刷新主线程UI。

2.重写run函数,使用emit 发射UpdateUI信号如下:

void QWorkThread::run()
{emit UpdateUI("刷新控件");
}

第二步:在MainWindow中定义一个槽函数,用来响应UpdateUI信号:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();public slots:void UpdateWidgetUI(QString strInfo);private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

第三步:调用connect连接UpdateUI信号和UpdateWidgetUI槽函数,刷新UI:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "qworkthread.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QWorkThread* pThread = new QWorkThread(ui->label);connect(pThread,&QWorkThread::UpdateUI,this,&MainWindow::UpdateWidgetUI);connect(pThread,&QThread::finished, pThread, &QThread::deleteLater);pThread->start();
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::UpdateWidgetUI(QString strInfo)
{ui->label->setText(strInfo);
}

程序运行前后结果:

微信截图_20250510231328

微信截图_20250510231328

方法二:使用invokeMethod()方法。

第一步:增加一个带QWidget的构造函数,并且在QWorkThread定义一个QWidget 类型的变量用来保存要刷新的控件。如上QWorkThread头文件中。

第二步:修改QWorkThread::run方法如下:

void QWorkThread::run()
{if(m_pWidget != nullptr)QMetaObject::invokeMethod(m_pWidget,"setText",Qt::QueuedConnection,Q_ARG(QString,"刷新控件2"));
}

其中调用QMetaObject::invokeMethod方法。

程序运行结果如下:

微信截图_20250510232257

虽然Qt不允许子线程直接操作UI界面,但通过信号与槽机制或invokeMethod()方法,子线程和UI线程可以安全地进行交互。这些机制确保了多线程程序的稳定性,避免了UI更新时可能出现的线程安全问题。

参考文章:Qt/C++面试【速通笔记五】—子线程与GUI线程安全交互

http://www.dtcms.com/wzjs/598549.html

相关文章:

  • 北京装修平台网站广东省自然资源厅事务中心
  • 西安动力无限网站建设网站建设与管理和计算机网络技术
  • 大连鼎信网站建设新媒体营销发展趋势
  • 维修网站怎么做西安建设商城类网站
  • 自学网站建设作业土木工程网官网登录
  • 无锡网站推广外包服务wordpress没有上级目录的写权限
  • 网站维护包括哪些网络设置怎么设置
  • 网站文章展示是做怎么wordpress 去掉category
  • 网站开发中的文档旅游商城网站模板免费下载
  • 营销型网站建设文章做响应式网站哪家公司好
  • 什么叫口碑营销论坛seo招聘
  • 抢车票网站怎么做汽车电子商务网站建设
  • 网站推广策略成功的案例汕头网站建设过程
  • 建设网站的必要性天津网站营销seo电话
  • WordPress站内搜索代码wordpress 模版仿米拓
  • 高校思政专题网站建设分享设计的网站
  • 网站开发外包平台wordpress 财经主题
  • 旅游分销网站建设方案民企厂房建设招标网站
  • 个人网站带论坛 备案wordpress上百人
  • 做阿里渠道的销售要有哪些网站湖南常德通报1例复阳病例
  • wordpress如何自建站WordPress增加下载按钮
  • 浙江省门户网站网站标题字符
  • 网站建设步骤列表图片网页设计实训报告的目的
  • 天津开发区建网站公司天然气公司的网站应该怎么做
  • 电子商务系统网站建设兰州电商网站建设
  • 三水住房和城乡建设局的网站怎么用网页制作一个网站
  • 做网站搞笑口号石碣做网站优化
  • 信誉好的企业网站开发网站流量 龙优化软件
  • 张家港网站建设做网站后端和前端哪个是青春饭
  • 有品质的网站推广公司怀化市住房与城乡建设厅网站