当前位置: 首页 > news >正文

Qt子线程更新UI的一种新玩法

目录

  • 1. 说明
  • 2. 场景
  • 3. 子线程更新UI的方法
    • 3.1 一般做法
    • 3.2 新玩法

1. 说明

Qt不允许子线程直接操作主线程UI,推荐的做法是,子线程发送信号,主线程响应该信号。其最终的效果,依旧不是子线程直接操作主线程UI。

2. 场景

假设现在有一个任务队列,队列里的每一个任务,都会在结束时,往主窗口的控制台打印一条消息。

代码如下:

class Console {
public:void printMessage(const QString& msg) const {m_lineEdit->setText(msg);}protected:QLineEdit* m_lineEdit;
};void threadFunc(Console * console) {// some other codesconsole->printMessage("message");
}int main() {Console console;// some other codesstd::thread th(threadFunc, &console);
}

在上述代码中,子线程更新主线程ui界面,这种方法在Qt中是不允许的。Qt禁止子线程更新主线程UI。

3. 子线程更新UI的方法

3.1 一般做法

一般的做法是,子线程发送信号,主线程接收信号,并执行对应槽函数。上述代码按照这种方式进行改造,如下:

class Console {
public slots:void printMessage(const QString& msg) const {m_lineEdit->setText(msg);}protected:QLineEdit* m_lineEdit;
};class Singal{
signals:void print(const QString&) const; public:void printMessage() const {emit print("message");}
};int main() {Console console;Singal signal;connect(&signal, SIGNAL(print(const QString&)), &console, SLOT(printMessage(const QString&)));std::thread th(&Singal::printMessage, &signal);
}

3.2 新玩法

从上面代码来看,一般做法里,代码量增加了不少。而且对现有代码的破坏性较大,这种破坏性更改,在接口类中,是难以容忍的。

为了保护接口,同时兼容信号槽方式,这里介绍一种新的方式:

class Console {
public:void printMessage(const QString& msg) const {emit print(msg);}signal:void print(const QString& msg);protected slots:void slotOnPrint(const QString& msg) {m_lineEdit->setText(msg);}protected:QLineEdit* m_lineEdit;
};void threadFunc(Console * console) {// some other codesconsole->printMessage("message");
}int main() {Console console;// some other codesstd::thread th(threadFunc, &console);
}

上面介绍的这种新玩法,调用方没做任何更改,接口类(Console)的公开接口也没改,增加了一个信号和一个本身的槽函数,同时它还是线程安全的。

相关文章:

  • 【Numpy】深入解析numpy中的ravel方法
  • Flink Task 性能指标
  • 【运筹学】前言:基础知识
  • 【MATLAB】数字滤波器的设计
  • 详解Java ThreadLocal
  • vi和vim有什么不同?
  • android-mvp模式
  • GPT-4 与 GPT-4 Turbo有什么区别?
  • 记一次重定向问题(浏览器安全)解决
  • Java基础——Optional
  • Vue框架-路由
  • vuejs路由和组件系统
  • 算法-可完成的最大任务数
  • Linux防火墙(以iptables为例)
  • 十种常用数据分析模型
  • ES6指北【2】—— 箭头函数
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • 2017 前端面试准备 - 收藏集 - 掘金
  • emacs初体验
  • jquery cookie
  • js正则,这点儿就够用了
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • PHP CLI应用的调试原理
  • springMvc学习笔记(2)
  • XForms - 更强大的Form
  • 从输入URL到页面加载发生了什么
  • 入门级的git使用指北
  • 深入 Nginx 之配置篇
  • 王永庆:技术创新改变教育未来
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 7行Python代码的人脸识别
  • ​14:00面试,14:06就出来了,问的问题有点变态。。。
  • ‌Excel VBA进行间比法设计
  • #define、const、typedef的差别
  • #java学习笔记(面向对象)----(未完结)
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • $.ajax()
  • (11)MATLAB PCA+SVM 人脸识别
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (C++17) optional的使用
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (强烈推荐)移动端音视频从零到上手(下)
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (一)Linux+Windows下安装ffmpeg
  • .config、Kconfig、***_defconfig之间的关系和工作原理
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET C# 操作Neo4j图数据库
  • .NET Core 2.1路线图
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .Net Core 生成管理员权限的应用程序
  • .NET Core中的时区转换问题