尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Qt——多线程与界面组件的通信
1.示例在子线程中创建QWidgetTestThread.h#ifndef TESTTHREAD_H #define TESTTHREAD_H #include QObject #include QThread class TestThread : public QThread { Q_OBJECT protected: void run(); public: explicit TestThread(QObject *parent nullptr); }; #endif // TESTTHREAD_HTestThread.cpp#include TestThread.h #include QWidget TestThread::TestThread(QObject *parent) : QThread{parent} {} void TestThread::run() { QWidget w; w.show(); exec(); }Widget.h#ifndef WIDGET_H #define WIDGET_H #include QWidget class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent nullptr); ~Widget() override; }; #endif // WIDGET_HWidget.cpp#include Widget.h #include TestThread.h Widget::Widget(QWidget *parent) : QWidget(parent) { TestThread* ptt new TestThread(); ptt-start(); } Widget::~Widget() default;main.cpp#include Widget.h #include QApplication int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); return QCoreApplication::exec(); }运行结果会报错原因是所有界面组件的操作都只能在主线程中完成因此主线程也叫做UI线程2.子线程如何对界面组件进行更新解决方案——信号与槽在子线程类中定义界面组件的更新信号updateUI在主窗口类中定义更新界面组件的槽函数setInfo使用异步方式连接更新信号到槽函数updateUI——setInfo子线程通过发射信号的方式更新界面组件所有的界面组件对象只能依附于主线程UpdateThread.h#ifndef UPDATETHREAD_H #define UPDATETHREAD_H #include QThread class UpdateThread : public QThread { Q_OBJECT protected: void run(); public: explicit UpdateThread(QObject *parent nullptr); signals: void updateUI(QString text); }; #endif // UPDATETHREAD_HUpdateThread.cpp#include UpdateThread.h UpdateThread::UpdateThread(QObject *parent) : QThread{parent} {} void UpdateThread::run() { emit updateUI(begin); for(int i0; i10; i) { emit updateUI(QString::number(i)); sleep(1); } emit updateUI(End); }Widget.h#ifndef WIDGET_H #define WIDGET_H #include QWidget #include UpdateThread.h #include QPlainTextEdit class Widget : public QWidget { Q_OBJECT UpdateThread m_thread; QPlainTextEdit textEdit; protected slots: void appendText(QString text); public: explicit Widget(QWidget *parent nullptr); ~Widget() override; }; #endif // WIDGET_HWidget.cpp#include Widget.h #include QObject Widget::Widget(QWidget *parent) : QWidget(parent) { textEdit.setParent(this); textEdit.move(20, 20); textEdit.resize(200, 150); textEdit.setReadOnly(true); connect(m_thread, SIGNAL(updateUI(QString)), this, SLOT(appendText(QString))); m_thread.start(); } void Widget::appendText(QString text) { textEdit.appendPlainText(text); } Widget::~Widget() default;main.cpp#include Widget.h #include QApplication int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); return QCoreApplication::exec(); }运行结果本质分析子线程发射信号通知主线程界面更新请求主线程根据具体信号以及信号参数对界面组件进行修改3.是否有其他间接的方式可以让子线程更新界面组件的状态——发送自定义事件类自定义事件类用于描述界面更新细节在主窗口类中重写事件处理函数event使用postEvent函数异步发送自定义事件类对象子线程指定接受消息的对象为主窗口对象在event事件处理函数更新界面状态StringEvent.h#ifndef STRINGEVENT_H #define STRINGEVENT_H #include QEvent #include QString class StringEvent : public QEvent { QString m_data; public: const static Type TYPE static_castType(QEvent::User 0xFF); explicit StringEvent(QString data ); QString data(); }; #endif // STRINGEVENT_HStringEvent.cpp#include StringEvent.h StringEvent::StringEvent(QString data) : QEvent(TYPE) { m_data data; } QString StringEvent::data() { return m_data; }UpdateThread.h#ifndef UPDATETHREAD_H #define UPDATETHREAD_H #include QThread class UpdateThread : public QThread { Q_OBJECT protected: void run(); public: explicit UpdateThread(QObject *parent nullptr); }; #endif // UPDATETHREAD_HUpdateThread.cpp#include UpdateThread.h #include QApplication #include StringEvent.h UpdateThread::UpdateThread(QObject *parent) : QThread{parent} {} void UpdateThread::run() { QApplication::postEvent(parent(), new StringEvent(Begin)); for(int i0; i10; i) { QApplication::postEvent(parent(), new StringEvent(QString::number(i))); sleep(1); } QApplication::postEvent(parent(), new StringEvent(End)); }main.cpp#include Widget.h #include QApplication int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); return QCoreApplication::exec(); }运行结果
RELATED

相关推荐

Docker持久化存储实战:Volume、Bind Mount与tmpfs选型指南

Docker持久化存储实战:Volume、Bind Mount与tmpfs选型指南

1. 为什么容器里存不了数据?——从“删掉容器就丢数据”说起你刚用docker run -d nginx起了一个 Web 服务,往/usr/share/nginx/html/里放了自己写的index.html,刷新浏览器看到页面正常;可一执行docker rm -f 容器ID,再…

📅 2026/9/10 1:47:24
客户专程进厂看进度,为何转头就追加订单?

客户专程进厂看进度,为何转头就追加订单?

一、客户困境:线上沟通再顺畅,也不如现场心里踏实昨天,模具丫姐在宜春立跃科技接待了一位专程到厂的外贸客户。在此之前,我们已经线上多轮对接,确认产品资料、模具方案,也持续同步项目进度,整体…

📅 2026/8/23 17:16:57
Whisper本地化部署实战:中文语音转文字的精度、速度与隐私平衡术

Whisper本地化部署实战:中文语音转文字的精度、速度与隐私平衡术

1. 项目概述:为什么 Whisper 正在改变我们处理语音的方式你有没有过这样的经历:录了一段30分钟的客户访谈,想整理成文字稿发给团队,结果手动敲键盘敲了两小时,还漏掉了关键数据;或者刚开完一场线上技术分享…

📅 2026/8/31 23:24:12
MORE NEWS

更多资讯

📰

SQL 优化的 15 个小技巧,超实用!

SQL 优化是一个大家都比较关注的热门话题,无论你在面试,还是工作中,都很有可能会遇到。如果某天你负责的某个线上接口,出现了性能问题,需要做优化。那么你首先想到的很有可能是优化 SQL 语句,因为它的改造成…

📰

源码深度解析,Spring 如何解决循环依赖?

1. 基础知识1.1 什么是循环依赖 ?一个或多个对象之间存在直接或间接的依赖关系,这种依赖关系构成一个环形调用,有下面 3 种方式。我们看一个简单的 Demo,对标“情况 2”。Service public class Louzai1 {Autowiredprivate Louzai2…

📰

AIGC检测与优化工具千笔的技术原理与应用

1. 项目背景与核心价值"千笔专业降AIGC智能体"这个工具名称本身就揭示了它的核心定位——这是一款面向学术场景的AIGC内容检测与优化工具。在当前AI生成内容(AIGC)爆发的时代,教育领域面临着前所未有的挑战:如何区分学生…

📰

MLflow Skinny 轻量级客户端解析:无 SQL 存储、Server 与数据科学依赖的精简安装方案

MLflow Skinny 轻量级客户端解析:无 SQL 存储、Server 与数据科学依赖的精简安装方案 【免费下载链接】mlflow The open source AI engineering platform for agents, LLMs, and ML models. MLflow enables teams of all sizes to debug, evaluate, monitor, and op…

📰

计算机中断处理机制:原理、流程与优化实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

从成分到方案:敏感肌美白产品怎么选?一个踩坑者的经验总结

写在前面: 我不是配方师,只是一个在敏感肌美白上踩了3年坑的普通人。这篇分享不讲复杂的化学原理,只讲我亲身验证过的筛选逻辑。问题:为什么敏感肌用美白产品容易翻车?敏感肌美白,和普通皮肤的提亮思路&…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

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

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

📞 💬