尧图网络 高端网站定制 · 原创设计
免费咨询热线
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/10/9 22:59:03
客户专程进厂看进度,为何转头就追加订单?

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

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

📅 2026/10/5 17:14:30
Whisper本地化部署实战:中文语音转文字的精度、速度与隐私平衡术

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

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

📅 2026/10/7 5:35:29
MORE NEWS

更多资讯

📰

电工证怎么鉴定真伪模拟考试题库

工地太忙根本没时间复习考试?教你一招快速鉴定电工证真伪,全国通用 工地太忙根本没时间复习考试,特种作业证到期又不知道怎么处理?很多人在一线施工时都遇到过这个问题,特别是像电工证这种 全国通用…

📰

诸暨考电工证哪里培训机构怎么选 电工证电子证书怎么拿

诸暨考电工证哪里培训机构怎么选 电工证电子证书怎么拿 实操考试心里没底怕挂科?这事儿别慌,很多人第一次考电工证的时候都和你一样,生怕操作失误,结果被判定不合格。其实,只要选择正规的培训机构,备考计划安排好,考试完全不是问题,而且拿到…

📰

海安电工证在哪里办 上岗必备怎么转回本地

海安电工证在哪里办 上岗必备怎么转回本地 之前考的证在外省能不能转过来?这几乎是每个电工从业者都会问的问题。特别是像你这样已经在驻马店从事水利工程相关工作的,手里有一张外地的电工证,现在想转回来继续在本地发展,不知道能不能直接用,或者是否需…

📰

浙江特种作业电工证怎么考不被坑?电子证书怎么查?

浙江特种作业电工证怎么考不被坑?电子证书怎么查? 你是不是也担心不知道去哪报名怕被中介坑?想考浙江特种作业电工证,却不知道该信哪家机构?现在网上信息太多,真假难辨,一不小心就被坑了钱又浪费时间。今天我就从一个干了10年应急管理行业的人角度,…

📰

高压电工证商场能用吗?电子证书怎么转?洛阳毕业生必看

高压电工证商场能用吗?电子证书怎么转?洛阳毕业生必看 之前考的证在外省能不能转过来?这是很多准备进入电力行业、尤其是高压电工证持证人最关心的问题。随着国家对特种作业操作证的监管越来越严格,电子证书的推行也让更多人意识到,…

📰

充电站是否用电工证?网上查询才知道真相

充电站是否用电工证?网上查询才知道真相 怕考不过白交培训费?很多想进充电站工作的朋友都问过这个问题, 充电站是否用电工证 ?答案不是一两句话能说清的,但如果你在网上查询了相关资料,或者找过机构报名,一定会遇到“报名材料清单”“跨省转介办理差…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

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

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

📞 💬