
QT 实时数据更新UI
MainWindow类:用于显示GUI界面并管理多线程操作 WorkThread类:用于实现长时间运行的背景任务 UI设计:基于Qt的标准UI组件 应用启动:通过main.cpp启动QApplication 主窗口显示:创建MainWindow实例并显示 子线程启动:点击启动按钮后,创建WorkThread实例并启动 数据传递:子线程通过信号将当前值发送到主线程,主窗口更新UI显示 子线程终止:点击停止按钮后,终止子线程并等待其完成
发布日期:2021-05-10 05:07:18
浏览次数:19
分类:精选文章
本文共 2854 字,大约阅读时间需要 9 分钟。
一个基于QThread的多线程C++ GUI应用程序示例
项目概述
这是一个基于Qt的C++ GUI应用程序示例,主要包括以下几个部分:
代码结构分析
1. 主窗口类(MainWindow)
- 包含头文件:
#include "mainwindow.h"
和#include "ui_mainwindow.h"
- 构造函数:初始化UI组件并设置初始状态
- 析构函数:释放UI资源
- 显示值函数:接收子线程发送的值并更新UI显示
- 按钮点击槽函数:启动和停止子线程
2. 工作线程类(WorkThread)
- 包含头文件:
#include "workthread.h"
- 构造函数:初始化线程
- 析构函数:释放线程资源
- 执行函数:实现长时间运行的循环任务
- 信号定义:定义一个信号,用于向主线程传递当前值
3. UI文件(mainwindow.ui)
- 布局设计:包括一个显示值的标签、启动按钮和停止按钮
- 布局管理:使用Qt的布局工具(如QHBoxLayout)来布局UI组件
4. 代码实现
4.1 main.cpp
#include "mainwindow.h"#includeint main(int argc, char *argv) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec();}
4.2 mainwindow.h
#ifndef MAINWINDOW_H#define MAINWINDOW_H#include "workthread.h"#includenamespace Ui { class MainWindow;}class MainWindow : public QMainWindow { Q_OBJECTpublic: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); void showValue(int value);public slots: void on_StartBtn_clicked(); void on_StopBtn_clicked();private: Ui::MainWindow *ui; WorkThread *workThread;};#endif // MAINWINDOW_H
4.3 mainwindow.cpp
#include "mainwindow.h"#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); ui->value->setText("0");}MainWindow::~MainWindow() { delete ui;}void MainWindow::showValue(int value) { ui->value->setText(QString::number(value));}void MainWindow::on_StartBtn_clicked() { workThread = new WorkThread(); workThread->start(); connect(workThread, SIGNAL(currentValue_signal(int)), this, SLOT(showValue(int))); ui->StartBtn->setEnabled(false); ui->StopBtn->setEnabled(true);}void MainWindow::on_StopBtn_clicked() { workThread->terminate(); workThread->wait(); ui->StartBtn->setEnabled(true); ui->StopBtn->setEnabled(false);}
4.4 workthread.h
#ifndef WORKTHREAD_H#define WORKTHREAD_H#includeclass WorkThread : public QThread { Q_OBJECTpublic: WorkThread(); ~WorkThread(); void run();signals: void currentValue_signal(int value);};#endif // WORKTHREAD_H
4.5 workthread.cpp
#include "workthread.h"#includeWorkThread::WorkThread() {}WorkThread::~WorkThread() {}void WorkThread::run() { while (1) { for (int n = 0; n < 10; n++) { emit currentValue_signal(n); msleep(1000); } msleep(1000); }}
5. UI设计说明
- 布局布局:使用Qt的标准布局组件(如QHBoxLayout)来布局界面
- 显示区域:一个QLabel用于显示当前值
- 按钮控制:两个按钮用于启动和停止子线程
- 信号与槽:通过信号与槽机制实现主线程与子线程的通信
6. 功能流程
7. 优化与改进方向
- 线程优化:当前使用QThread,建议优化为QThread的子类实现更高效的线程管理
- 资源管理:确保线程资源在终止时得到妥善释放
- 异常处理:增加错误处理机制以避免程序崩溃
- 性能监控:通过工具监控线程性能,优化运行效率
通过以上代码结构和设计,可以快速实现一个基于QThread的多线程C++ GUI应用程序。
发表评论
最新留言
不错!
[***.144.177.141]2025年04月28日 05时08分57秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Kubernetes 自定义服务的启动顺序
2023-01-29
Java基础:Character 类概念、构造函数、实例方法、类方法
2023-01-29
Kubernetes 资源调度详解
2023-01-29
Java基础:StringBuffer类概念、构造函数、常用方法
2023-01-29
Kubernetes 部署 kubeflow1.7.0
2023-01-29
Java基础:变量(声明、赋值、引用)、基本数据类型、作用域
2023-01-29
Kubernetes 部署SonarQube
2023-01-29
Java基础:如何编写并执行入门级别程序 Hello World
2023-01-29
Java基础:循环语句for、while和do-while
2023-01-29
kubernetes 部署SonarQube 7.1 关联LDAP
2023-01-29
Java基础:按位运算符
2023-01-29
Kubernetes 配置管理实战
2023-01-29
Java基础:数字类概念、常用方法、常量
2023-01-29
Kubernetes 针对资源紧缺处理方式的配置
2023-01-29
Java基础:数组创建、初始化、引用、分类
2023-01-29
Java基础:数组的长度、数组的复制
2023-01-29
Java基础:条件运算符
2023-01-29
Java基础:比较运算符
2023-01-29
Kubernetes 集群卸载清理
2023-01-29