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 ...
随机推荐
- NPOI 导出 EXCEL
1. 2.创建NPOIHelper using System;using System.Collections.Generic;using System.Data;using System.IO;us ...
- Dilated Neighborhood Attention Transformer概述
0.前言 相关资料: arxiv github 论文解读 论文基本信息: 发表时间:arxiv2022(2022.9.29) 1.针对的问题 之前的方法通过局部注意力机制来降低计算复杂度,但这削弱了自 ...
- 理解函数调用_使用arguments参数对所有函数参数执行操作
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- python 本地l离线安装whl文件
记录下无网络时安装Python环境 一: 单独下载文件 1.下载whl离线文件到本地,放到c盘根目录(任意位置均可,只是方便安装) https://pypi.org/ https://www.lfd. ...
- js 深拷贝 和 浅拷贝
1. ...运算符 (浅拷贝) let obj = {a:1,b:2}; let obj2 = {...obj}; obj.a=3 obj //{a: 3, b: 2} obj2 //{a: 1, ...
- UniCode 下char*转CString ,利用MultiByteToWideChar进行转换,中文乱码的解决方案
//计算char *数组大小,以字节为单位,一个汉字占两个字节 int charLen = strlen(sText); //计算多字节字符的大小,按字符计算. int len = MultiByte ...
- BZOJ1008 [HNOI2008]越狱 (快速幂,组合)
题目大意 求\(m\)种数字组成的长度为\(n\)的序列的种数,序列中至少有一段连续的数字 分析 用可重排列的种数减去,相邻数字互不相同的序列种数 考虑相邻互不相同,第一个元素有\(m\)种可能,后面 ...
- 打包python文件为exe程序 vscode
一.项目下虚拟环境下载pyinstaller.exe 打包 1.检查是否下载 pyinstaller: 如果没有在vscode终端输入:pip3 install pyinstaller 安装成功后下 ...
- DAST 代码分析
DA部分 输入图片大小: images.size: torch.Size([1, 3, 512, 1024])labels.size: torch.Size([1, 512, 1024]) input ...
- Linux CentOS 8系统离线升级内核版本
Linux CentOS 8系统离线升级内核版本 搬运如下文章,十分感谢 https://blog.csdn.net/WQwinter/article/details/127231086 二.升级步骤 ...