Qt在运行时会开启一个主线程,如果没有开启工作线程的话,所有界面上的操作都是在主线程,包括更新界面或者处理数据等操作。大家都知道如果处理数据比较多的话,最好是在单独开启一个线程来处理数据,这样就不会影响主线程的运行。如果在工作线程中更新界面,会如何呢?

线程类:

#pragma once#include <QThread>
class QtGuiMainThread;class ThreadTest : public QThread {Q_OBJECTpublic:ThreadTest(QObject *parent);~ThreadTest();void setObj(QtGuiMainThread* obj);protected:void run();
private:QtGuiMainThread* guiMain = nullptr;
};
#include "ThreadTest.h"
#include "QtGuiMainThread.h"ThreadTest::ThreadTest(QObject *parent)
: QThread(parent) {
}ThreadTest::~ThreadTest() {
}void ThreadTest::setObj(QtGuiMainThread* obj) {guiMain = obj;
}void ThreadTest::run() {while (true) {msleep(1);guiMain->runInThread();}
}

主界面:

#pragma once#include <QtWidgets/QMainWindow>
#include "ui_QtGuiMainThread.h"
class ThreadTest;class QtGuiMainThread : public QMainWindow {Q_OBJECTpublic:QtGuiMainThread(QWidget *parent = Q_NULLPTR);void runInThread();
private slots:void slotBtnStartThread();
private:Ui::QtGuiMainThreadClass ui;ThreadTest* thread = nullptr;int cnt = 0;
};
#include "QtGuiMainThread.h"
#include "ThreadTest.h"QtGuiMainThread::QtGuiMainThread(QWidget *parent)
: QMainWindow(parent) {ui.setupUi(this);thread = new ThreadTest(this);thread->setObj(this);connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(slotBtnStartThread()));
}void QtGuiMainThread::slotBtnStartThread() {if (thread != nullptr){thread->start();}
}void QtGuiMainThread::runInThread() {cnt++;ui.label->setText(QStringLiteral("当前计数:%1").arg(cnt));
}


点击按钮【开始】启动线程,程序出现了崩溃:

说明QT不允许工作线程中更新界面!

那就修改一下代码,通过信号槽的方式更新界面
主界面:

#pragma once#include <QtWidgets/QMainWindow>
#include "ui_QtGuiMainThread.h"
class ThreadTest;
class QCloseEvent;class QtGuiMainThread : public QMainWindow {Q_OBJECTpublic:QtGuiMainThread(QWidget *parent = Q_NULLPTR);void runInThread();void closeEvent(QCloseEvent *event);
signals:void sigCount();
private slots:void slotBtnStartThread();void slotCount();private:Ui::QtGuiMainThreadClass ui;ThreadTest* thread = nullptr;int cnt = 0;
};
#include "QtGuiMainThread.h"
#include "ThreadTest.h"QtGuiMainThread::QtGuiMainThread(QWidget *parent)
: QMainWindow(parent) {ui.setupUi(this);thread = new ThreadTest(this);thread->setObj(this);connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(slotBtnStartThread()));connect(this, SIGNAL(sigCount()), this, SLOT(slotCount()));
}void QtGuiMainThread::slotBtnStartThread() {if (thread != nullptr){thread->start();}
}void QtGuiMainThread::runInThread() {emit sigCount();
}void QtGuiMainThread::slotCount() {cnt++;ui.label->setText(QStringLiteral("当前计数:%1").arg(cnt));
}void QtGuiMainThread::closeEvent(QCloseEvent *event) {if (thread->isRunning()) {thread->terminate();thread->quit();}}

然后运行一下:
程序能够正常运行,以上!

aaa

Qt主线程和工作线程更新界面问题相关推荐

  1. 服务器端编程心得(一)—— 主线程与工作线程的分工

    服务器端为了能流畅处理多个客户端链接,一般在某个线程A里面accept新的客户端连接并生成新连接的socket fd,然后将这些新连接的socketfd给另外开的数个工作线程B1.B2.B3.B4,这 ...

  2. QT 主线程和任务线程通过信号交互

    因为 qt线程中如果执行ui操作是很容易死机的,而且是不知道那的错误,所以分开执行,通过信号交互,但有时ui线程的单个任务比较久,所以需要等些时间,下面直接上代码,以做备份 主要是从树中取出一堆文件路 ...

  3. QT 主线程子线程互相传值

    本文实现了主线程给子线程传值.子线程给主线程传值.主线程子线程的互相传值.线程源文件mythread.h..cpp:主线程文件mainwindow.h..cpp;下面程序先从主线程调用子线程,子线程给 ...

  4. qt调用linux系统的线程函数吗,Qt之主线程与子线程通讯(linux下)

    Qt之主线程与子线程通信(linux下) 转载请注明出处:http://blog.csdn.net/feng1790291543 主线程与子线程通信主要是通过Qt上的Gui按钮,触发使得主线程上的信息 ...

  5. c++主线程等待子线程结束_简单明了的 Python 多线程来了 | 原力计划

    作者 | 万里羊责编 | 王晓曼出品 | CSDN博客线程和进程计算机的核心是CPU,它承担了所有的计算任务,就像是一座工厂在时刻运行.如果工厂的资源有限,一次只能供一个车间来使用,也就是说当一个车间 ...

  6. Android,UI主线程与子线程

    在一个Android 程序开始运行的时候,会单独启动一个Process.默认的情况下,所有这个程序中的Activity或者Service(Service和 Activity只是Android提供的Co ...

  7. android主线程和子线程的区别

    android 主线程和子线程有什么区别 本文较为深入的分析了android中UI主线程与子线程.分享给大家供大家参考. 具体如下:在一个Android 程序开始运行的时候,会单独启动一个Proces ...

  8. Android线程之主线程向子线程发送消息

    和大家一起探讨Android线程已经有些日子了,谈的最多的就是如何把子线程中的数据发送给主线程进行处理,进行UI界面的更新,为什么要这样,请查阅之前的随笔.本篇我们就来讨论一下关于主线程向子线程如何发 ...

  9. Android Handler主线程和一般线程通信的应用分析

    Handler的定义:主要接受子线程发送的数据, 并用此数据配合主线程更新UI. 解释: 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进 ...

最新文章

  1. 2022-2028年中国摩托车行业投资分析及前景预测报告(全卷)
  2. 看不见的Unicode码让敏感词轻松逃过审核,谷歌IBM都中招
  3. 自学python有哪些网站-python有哪些学习网站
  4. C#发现之旅第十四讲 基于动态编译的VB.NET脚本引擎
  5. Java的String.format可以静态导入
  6. 程序员外包避坑指南?
  7. *** is required and cannot be removed from the server
  8. 作为新手程序员,掉过的那些坑!
  9. 多输出模型实例的数据加载
  10. 数据结构与算法--图的概念
  11. 如何查看windows的CUDA版本
  12. 流媒体协议之WebRTC实现p2p视频通话(二)
  13. 进阶成高级前端的四大方法
  14. 【Vue】Vue 项目搭建
  15. 浏览器性能和兼容性测试
  16. 12x12怎么速算_如果孩子正读小学,学会这4个乘法速算技巧,将大大提高计算速度...
  17. 武汉前端技术和找工作微信交流群
  18. (186)Verilog HDL:3位线性反馈移位寄存器
  19. OracleP6机场工程进度控制系列17:机场工程建设总进度计划清单
  20. postgres主备库切换测试

热门文章

  1. 关于游戏中的数据分析
  2. 黑魂向project制作学习三:摄像头碰撞(Camera Collisions)
  3. R语言 | 编写自己的函数
  4. u盘提示格式化怎么修复教程
  5. 618蓝牙耳机选哪一款比较好?推荐口碑最好的无线蓝牙耳机品牌
  6. 软考报名资格审核要多久?证明材料要哪些?
  7. flex 移动开发 html5,[ html5 ] 移动端适配方案 flex布局+rem布局
  8. SQL数据库修复教程-浪潮GS7.0中了后缀是.5ss5c勒索病毒修复过程
  9. 技术真好玩第一期(2019-11-01)
  10. 使用Cerebro管理ES集群