00. 目录

文章目录

  • 00. 目录
  • 01. 概述
  • 02. 开发环境
  • 03. 实时更新UI(非信号与槽)
  • 04. 实时更新UI(信号与槽)
  • 05. 源码下载
  • 06. 附录

01. 概述

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

02. 开发环境

Windows系统:Windows10

Qt版本:Qt5.15或者Qt6

03. 实时更新UI(非信号与槽)

QT中不建议工作线程中更新界面。

workthread.h

#ifndef WORKTHREAD_H
#define WORKTHREAD_H#include <QThread>class MainWindow;
class QLabel;class WorkThread : public QThread
{Q_OBJECT
public:WorkThread(QObject *parent);~WorkThread();void setObject(MainWindow *obj);void setLabel(QLabel *l);void stop();protected:void run();private:MainWindow *mainObject = nullptr;QLabel *label = nullptr;int i = 0;volatile bool stopped = false;
};#endif // WORKTHREAD_H

workthread.cpp

#include "workthread.h"
#include "mainwindow.h"#include <QLabel>
#include <QDebug>WorkThread::WorkThread(QObject *parent):QThread(parent)
{stopped = false;
}WorkThread::~WorkThread()
{}void WorkThread::setObject(MainWindow *obj)
{mainObject = obj;
}void WorkThread::setLabel(QLabel *l)
{label = l;
}void WorkThread::run()
{qDebug() << "线程开始运行";while(!stopped){msleep(1);i++;//mainObject->runInThread();label->setText(QString("当前计数为:%1").arg(i));}//下次启动stopped = false;
}//暂停线程
void WorkThread::stop()
{stopped = true;qDebug() << "线程已经暂停";
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>#include "workthread.h"QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass WorkThread;class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();void runInThread();private slots:void on_pushButton_clicked();void on_pushButton_2_clicked();private:Ui::MainWindow *ui;WorkThread *thread = nullptr;int count = 0;
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"#include "workthread.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);thread = new WorkThread(this);thread->setObject(this);thread->setLabel(ui->label);ui->pushButton->setEnabled(true);ui->pushButton_2->setEnabled(false);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::runInThread()
{count++;ui->label->setText(QString("当前计数为: %1").arg(count));
}//启动线程
void MainWindow::on_pushButton_clicked()
{if (nullptr != thread){thread->start();}ui->pushButton->setEnabled(false);ui->pushButton_2->setEnabled(true);
}//暂停线程
void MainWindow::on_pushButton_2_clicked()
{if (nullptr != thread){thread->stop();}ui->pushButton->setDisabled(false);ui->pushButton_2->setDisabled(true);
}

主界面

04. 实时更新UI(信号与槽)

workthread.h

#ifndef WORKTHREAD_H
#define WORKTHREAD_H#include <QThread>class MainWindow;
class QLabel;struct Student
{int id;char sex;QString name;
};//声明元类型
Q_DECLARE_METATYPE(Student)class WorkThread : public QThread
{Q_OBJECT
public:WorkThread(QObject *parent);~WorkThread();void stop();protected:void run();signals:void sigCount(Student s);private:int i = 0;volatile bool stopped = false;
};#endif // WORKTHREAD_H

workthread.cpp

#include "workthread.h"
#include "mainwindow.h"#include <QLabel>
#include <QDebug>WorkThread::WorkThread(QObject *parent):QThread(parent)
{//注册自定义类型qRegisterMetaType<Student>();stopped = false;
}WorkThread::~WorkThread()
{}void WorkThread::run()
{qDebug() << "线程开始运行";while(!stopped){i++;//发送信号Student s;s.id = i;s.sex = 'M';s.name = "lily";emit sigCount(s);msleep(1);}//下次启动stopped = false;
}//暂停线程
void WorkThread::stop()
{stopped = true;qDebug() << "线程已经暂停";
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>#include "workthread.h"QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass WorkThread;class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void on_pushButton_clicked();void on_pushButton_2_clicked();void slotSetValue(Student s);private:Ui::MainWindow *ui;WorkThread *thread = nullptr;
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"#include "workthread.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);thread = new WorkThread(this);ui->pushButton->setEnabled(true);ui->pushButton_2->setEnabled(false);connect(thread, &WorkThread::sigCount, this, &MainWindow::slotSetValue);
}MainWindow::~MainWindow()
{delete ui;
}//启动线程
void MainWindow::on_pushButton_clicked()
{if (nullptr != thread){thread->start();}ui->pushButton->setEnabled(false);ui->pushButton_2->setEnabled(true);
}//暂停线程
void MainWindow::on_pushButton_2_clicked()
{if (nullptr != thread){thread->stop();}ui->pushButton->setDisabled(false);ui->pushButton_2->setDisabled(true);
}//槽函数
void MainWindow::slotSetValue(Student( s))
{ui->label->setText(QString("当前值为: %1 %2 %3").arg(s.id).arg(s.sex).arg(s.name));
}

主界面

【温馨提示】

如果要在Qt信号槽中使用自定义类型,需要注意使用qRegisterMetaType对自定义类型进行注册,当然在不跨线程时使用自定义类型signal/slot来传递,可能不会出现什么问题;一旦涉及跨线程就很容易出错,回想下信号槽的作用就是用来对象与对象之间通信的,难免会跨线程,建议在使用自定义类型利用信号槽通信时,最好先通过qRegisterMetaType()将自定义类型进行注册,以免出错。

总结qRegisterMetaType使用方法如下:
1、注册位置:在第一次使用此类链接跨线程的signal/slot之前,一般在当前类的构造函数中进行注册;
2、注册方法:在当前类的顶部包含:#include ,构造函数中加入代码:qRegisterMetaType(“Myclass”);
3、Myclass的引用类型需单独注册:qRegisterMetaType(“Myclass&”);

05. 源码下载

下载:实时更新UI(信号与槽方式).rar

06. 附录

6.1 Qt教程汇总
网址:https://dengjin.blog.csdn.net/article/details/115174639

【Qt】 Qt中实时更新UI程序示例相关推荐

  1. php 微信实时更新,微信小程序修改data使页面数据实时更新的代码示例

    本篇文章给大家带来的内容是关于微信小程序修改data使页面数据实时更新的代码示例,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 需求:通过点击button修改dataList中che ...

  2. 安卓在子线程中实现更新UI界面的三种方法 Handler+Message、runOnUiThread、控件.post()

    1.说明 安卓中UI线程为主线程,更新UI界面必须在主线程中进行,在子线程中实现更新UI界面的三种方法:Handler.RunOnUiThread.控件.post() 2.1 Handler (1)定 ...

  3. Android 为什么不能在子线程中直接更新UI

    1.现象 在子线程中直接更新UI就会crash,报错如下: android.view.ViewRootImpl$CalledFromWrongThreadException:Only the orig ...

  4. Unity中实时更新图片的方法探究

    背景 最近继续在做VR会议,在共享桌面这一块遇到了一个棘手的问题.在会议中,共享的桌面是通过发送一帧一帧的图片来实现的.在Unity中需要把图片渲染出来. 3个难点 在Unity实时的渲染图片有3个难 ...

  5. ACCESS在程序运行中实时更新查询列表的条件

    最近抽时间在帮其它部门处理数据,使用ACCESS处理数据,里面有个需求,需要在运行时动态的更改一个查询的条件(也就是更新SQL语句内容).之前简单的想法是像更改报表一样的更改查询条件. 报表的格式可以 ...

  6. HBuilder开发小程序,如何实现在微信开发者工具中实时更新

    做小程序开发的砖友们,肯定对uni-app不陌生,HBuilder(简称HB)由于自身强大的集成,及对现在前端主流框架的友好支持,大大的提升了开发的效率,希望这篇文章对刚开始入手开发的砖友们有所帮助! ...

  7. 在cmd命令行运行exe,并在命令行中输入参数的程序示例

    int main(int argc, char **argv) { - } 若可执行程序名是 my.exe 输入参数 -- 命令行键入: my.exe -t 1230 h hehe -um 10 0 ...

  8. 安卓端网页浏览过程中实时更新title的web实现

    1 $(function () { 2 var scrollTop = 0, //缓存上一次触发scroll的时候的scrollTop值 3 appendIndex = 0, //由于第23行appe ...

  9. distiller的另一个实例正忙于启动_PYQT5学习(02):利用Qt Designer制作第一个窗口程序

    目标 利用Qt Designer设计窗口界面 使用PyUIC把Qt Designer生成的UI文件转换为py文件 使用转换生成的py文件 创建项目 启动启动pycharm并创建项目 这一环节在这里就不 ...

最新文章

  1. 如何0代码、快速定制企业级NLP模型?百度技术大咖在线解析,可报名
  2. 数据中心的供配电与空调
  3. ce5e.cn fadian.php,空包网 PHP mysql
  4. PART 5: INTEGRATING SPRING SECURITY WITH SPRING BOOT WEB
  5. 如何在Tomcat中设置JNDI数据库连接池-Spring教程示例
  6. mvc如何嵌套第三方页面_长文观点丨为什么我不再使用MVC框架?
  7. 机器学习 | EM 算法原理
  8. 尝鲜 Svelte 前端框架,开发读书笔记
  9. mysql like BR%._MySQL Like子句
  10. 关于oracle存储微信表情emoji问题 “[[%F0%9F%A4%AA]]“
  11. spring boot redis分布式锁
  12. AHP层次分析法具体操作
  13. apiDoc之api接口文档生成
  14. 沪漂五年:我是如何从职场失意,走向皮实的人生?
  15. python 编写computer类
  16. solidity智能合约[4]-pure与view剖析
  17. Apache运维中常用功能配置笔记梳理
  18. 解决论文目录页码对不齐问题
  19. a DNS-1123 label must consist of lower case alphanumeric characters or ‘-‘, and must start and end w
  20. python关于函数作用的描述_Python函数的概念和使用

热门文章

  1. amcharts 网页绘图插件
  2. SoC嵌入式软件架构设计之二:虚拟内存管理原理、MMU硬件设计及代码分块管理...
  3. Axure RP Pro 6.0 原型设计工具(产品经理必备)
  4. 3 CSS 高级语法
  5. vst3插件_Blue Cat Audio Blue Cat PatchWork mac(蓝猫桥接插件)
  6. migo获取header sap_Adjust Stock(MI06, MI07, MIGO)
  7. Java黑皮书课后题第5章:5.2(重复加法)程序清单5-4产生了5个随机减法问题。改写该程序,使它产生10个随机加法问题,加数时两个1到15之间的整数。显示正确答案的个数和完成测试的时间
  8. Linux下Shell的for循环语句
  9. sql serve 数据库游标的使用
  10. spring beanFactory