Qt非主线程显示窗口的简易思路
首发于我的个人博客:xie-kang.com
博客内有更多文章,欢迎大家访问
原文地址
Qt 在非主线程是无法显示UI窗口的,如果我们在其它线程中处理完数据,需要使用窗口展示,或者在其它线程需要使用到QFileDialog让用户选取文件路径等,有什么办法可以处理这些场景吗?
约定:本文将线程分为主线程与非主线程。
基本思路:当我们需要显示UI窗口时,先信号与槽函数把消息投递到主线程,让主线程帮忙展示我们所需的窗口,当用户完成指定交互时,我们再把数据通过信号与槽传回非主线程。
非主线程非模态窗口:
发送弹窗信号到主线程后,继续执行后续任务,
示例:
// 初始化
connet(this, &thisClass::sigShowDlg, m_mainindow, &MainWindow::slotShowDlg);
connet(m_mainWindow, &MainWindow::sigData, this, &thisClass::slotGetData);
...
// 需要弹窗显示时
emit sigShowDlg();
模拟模态窗口处理方法:
非主线程在发送请求窗口信号后,使用QEventLoop进行阻塞,当主线程处理好窗口事件后再将数据返回,并退出QEventLoop。
示例:
// 初始化
connet(this, &thisClass::sigShowDlg, m_mainWindow, &MainWindow::slotShow);
connet(m_mainWindow, &MainWindow::sigTaskData, this, &thisClass::slotGetData);
...
QEventLoop loop;
// 假设你完成在主线程完成任务时发送sigFinished信号
connet(mianwindow, &MainWindow::sigFinished, &loop, &QEventLoop::exit);
emit sigShowDlg();
// 阻塞直到结束
loop.exec();
Qt非主线程显示窗口的简易思路的更多相关文章
- Android 在非主线程无法操作UI意识
Android在应用显示Dialog是一个非常easy事儿,但我从来没有尝试过Service里面展示Dialog. 经验UI操作要在主线程,本地的服务Service是主线程里没错,可是远程servic ...
- 在非主线程中更新UI
在非主线程中调用了showMessage方法,结果报错:Can't create handler inside thread that has not called Looper.prepare() ...
- 在非主线程里面使用NSTimer创建和取消定时任务
为什么要在非主线程创建NSTimer 将 timer 添加到主线程的Runloop里面本身会增加线程负荷 如果主线程因为某些原因阻塞卡顿了,timer 定时任务触发的时间精度肯定也会受到影响 有些定时 ...
- ThreadLocal ——android消息机制handler在非主线程创建not called Looper.prepare() 错误的原因
引用自:https://www.jianshu.com/p/a8fa72e708d3 引出: 使用Handler的时候,其必须要跟一个Looper绑定.在UI线程可直接初始化Handler来使用.但是 ...
- 后台子线程(非主线程)更新UI引起的警告
一.问题描述 -(void)sendAsynchronousRequest { NSLog(@"%@",[NSThread currentThread]); [SVProgress ...
- [转]QT子线程与主线程的信号槽通信-亲测可用!
近用QT做一个服务器,众所周知,QT的主线程必须保持畅通,才能刷新UI.所以,网络通信端采用新开线程的方式.在涉及到使用子线程更新Ui上的控件时遇到了点儿麻烦.网上提供了很多同一线程不同类间采用信号槽 ...
- Android关于主线程和非主线程
必须在主线程执行的任务: (1)UI更新 必须在非主线程中执行的任务 (1)Http请求 如执行:ImageHelper.getInstance().loadImageSync(picUrl); 外面 ...
- 2018-10-31-WPF-在触摸线程等待主线程窗口关闭会让主线程和触摸线程相互等待
title author date CreateTime categories WPF 在触摸线程等待主线程窗口关闭会让主线程和触摸线程相互等待 lindexi 2018-10-31 9:30:9 + ...
- Handler详解系列(四)——利用Handler在主线程与子线程之间互发消息,handler详解
MainActivity如下: package cc.c; import android.app.Activity; import android.os.Bundle; import android. ...
- 开子线程下载图片,回到主线程刷新UI步骤
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { [NSThread detachN ...
随机推荐
- 字体样式font-style
font-family 指的是字体比如 "宋体","微软雅黑"等等 具体字体:微软雅黑.宋体.黑体.宋体等等 字体系列:sans-serif.serf.mono ...
- 软件离线许可(License)实现原理
我们经常使用各种开发软件,比如IntelliJ IDEA.Navicat.Visual Studio等,这些软件都有一个特点,就是要收费.一般是我们需要去购买一个许可,然后输入这个许可到软件里就能够使 ...
- 利用Canal投递MySQL Binlog到Kafka
https://www.aboutyun.com/thread-27654-1-1.html https://www.cnblogs.com/bigdatalearnshare/p/13832709. ...
- VUE中如何使用MOCK
安装mockjs npm install mockjs 可以使用数据模板生成模拟数据. Mock.mock( rurl?, rtype?, template ) ) // 或者 Mock.mock( ...
- JS篇(010)-JavaScript 继承的方式和优缺点
答案:六种方式 一.原型链继承 缺点: 引用类型的属性被所有实例共享 在创建 Child 的实例时,不能向 Parent 传参 二.借用构造函数(经典继承) 优点: 避免了引用类型的属性被所有实例共享 ...
- Coursera Programming Languages, Part B 华盛顿大学 Week 2
Datatype-programming in Racket without structs 在 ML 语言中,我们使用 datatype binding 来实现对 标签联合类型的构建:传送门 这是因 ...
- secureCRT设置配色方案
https://blog.csdn.net/qq_42672770/article/details/81301494
- 6. Python 模块
模块其实就是一个python文件 python导入模块的顺序 1. 从当前目录下找需要导入的python文件 2. 从python的环境变量中找 sys.path 当前目录和sys.path中都有im ...
- Docker学习——Kubernetes(八)
在线阅读:GitBook 下载:pdf Kubernetes 是 Google 团队发起并维护的基于 Docker 的开源容器集群管理系统,它不仅支持常见的云平台,而且支持内部数据中心. 建于 Doc ...
- vscode python配置pip源
更换到国内清华园 C盘-User-用户名-新建"pip"文件夹-新建"pip.ini"文件 pip.ini 文件中内容: [global]index-url = ...