Qt消息循环与模态对话框和线程关系整理

2024-08-27 04:18

本文主要是介绍Qt消息循环与模态对话框和线程关系整理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题

之前在分析Qt事件循环源码时,相比很多人都会有疑问,当主线程(GUI 线程)在接受到某些命令时会弹出一个对话框,这个对话框会阻塞主界面的响应,这时候是不是有个子线程在处理弹出对话框的消息(毕竟这和多线程处理很像)?

概念普及

什么是模态对话框?

对于用户分成模态对话框非模态对话框(如下解释源于百度百科)

  • 模态对话框:又叫做模式对话框,是指在用户想要对对话框以外的应用程序进行操作时,必须首先对该对话框进行响应。如单击【确定】或【取消】按钮等将该对话框关闭。
  • 非模态对话框:又叫做无模式对话框,当用户打开非模态对话框时,依然可以操作其他窗口。例如,Windows提供的记事本程序中的【查找】对话框。【查找】对话框不会垄断用户的输入,打开【查找】对话框后,仍可与其他用户界面对象进行交互。
Qt中的模态对话框
  • 模态对话框,会阻塞当前主界面及其他窗体,后续代码必须等到当前窗体关闭后方可执行
    QDialog* pDialog = new QDialog(this);pDialog->setWindowTitle(QString::fromUtf8("模态对话框"));//以模态方法显示对话框pDialog->exec();// 关闭模态对话框后,才会继续执行下面的代码qDebug() << __FUNCTION__ <<"模态对话框";
  • 非模态对话框,不会阻塞当前主界面及其他窗体,不影响后续代码立即执行
    QDialog* pDialog = new QDialog(this);pDialog->setWindowTitle(QString::fromUtf8("非模态对话框"));//以非模态方法显示对话框pDialog->show();//无需关闭弹出对话框,下面的代码会立即运行qDebug() << __FUNCTION__ <<"非模态对话框";
  • 半模态对话框,会阻塞当前主界面及其他窗体,同时不影响后续代码立即执行
    QDialog* pDialog = new QDialog(this);pDialog->setWindowTitle(QString::fromUtf8("半模态对话框"));//以半模态方法显示对话框pDialog->open();//无需关闭弹出对话框,下面的代码会立即运行qDebug() << __FUNCTION__ <<"半模态对话框";
问题解析

解析的问题会从浅到深

弹出的窗体是什么?

模态对话框/非模态对话框

是否有子线程在处理弹出对话框的消息?

没有!且只有一个主线程

是否可以在子线程中更新UI?

不可以!和很多GUI开发类似,均不支持在子线程中更新GUI,如果想更新,可以通过信号槽机制,在槽函数(主线程)中更新UI

弹出的对话框上是如何响应各种事件的?

如果是QDialog::exec()(模态对话框),主线程的事件循环(QEventLoop)处于挂起状态,并且会在主消息循环上开一个子消息循环,直到这个消息循环被退出,外部的主消息循环才会继续。整个过程可以类比成两个嵌套的while循环

    while(主事件循环){processEvents(创建对话框事件){dialog new_dlg; while(子事件循环){};};    }
事件循环与线程的关系?

一个线程可以有多个事件循环 (1对多)

事件循环的特点?
  • 一个线程可以有多个事件循环,但所有的事件循环是嵌套关系,一层套一层。当前QEventLoop被激活时,父QEventLoop会被中断,直到子事件循环结束,父QEventLoop才会继续执行;
  • 子事件循环会拥有父事件循环的所有功能,这也是当弹出dialog,GUI不会被卡住的原因

总结

作为Qt开发经常会搞混线程和事件(消息)循环的关系,如果你真的想让你的程序避免出现异常(crash),那你必须理解这两个的关系。(多看源码,多写demo)

  • 主线程=GUI线程
  • 一个线程可以有多个事件循环
  • 事件循环之间的关系是嵌套

这篇关于Qt消息循环与模态对话框和线程关系整理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1110607

相关文章

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

POJ1269 判断2条直线的位置关系

题目大意:给两个点能够确定一条直线,题目给出两条直线(由4个点确定),要求判断出这两条直线的关系:平行,同线,相交。如果相交还要求出交点坐标。 解题思路: 先判断两条直线p1p2, q1q2是否共线, 如果不是,再判断 直线 是否平行, 如果还不是, 则两直线相交。  判断共线:  p1p2q1 共线 且 p1p2q2 共线 ,共线用叉乘为 0  来判断,  判断 平行:  p1p

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

poj3750约瑟夫环,循环队列

Description 有N个小孩围成一圈,给他们从1开始依次编号,现指定从第W个开始报数,报到第S个时,该小孩出列,然后从下一个小孩开始报数,仍是报到S个出列,如此重复下去,直到所有的小孩都出列(总人数不足S个时将循环报数),求小孩出列的顺序。 Input 第一行输入小孩的人数N(N<=64) 接下来每行输入一个小孩的名字(人名不超过15个字符) 最后一行输入W,S (W < N),用

ActiveMQ—消息特性(延迟和定时消息投递)

ActiveMQ消息特性:延迟和定时消息投递(Delay and Schedule Message Delivery) 转自:http://blog.csdn.net/kimmking/article/details/8443872 有时候我们不希望消息马上被broker投递出去,而是想要消息60秒以后发给消费者,或者我们想让消息没隔一定时间投递一次,一共投递指定的次数。。。 类似

线程的四种操作

所属专栏:Java学习        1. 线程的开启 start和run的区别: run:描述了线程要执行的任务,也可以称为线程的入口 start:调用系统函数,真正的在系统内核中创建线程(创建PCB,加入到链表中),此处的start会根据不同的系统,分别调用不同的api,创建好之后的线程,再单独去执行run(所以说,start的本质是调用系统api,系统的api

【QT】基础入门学习

文章目录 浅析Qt应用程序的主函数使用qDebug()函数常用快捷键Qt 编码风格信号槽连接模型实现方案 信号和槽的工作机制Qt对象树机制 浅析Qt应用程序的主函数 #include "mywindow.h"#include <QApplication>// 程序的入口int main(int argc, char *argv[]){// argc是命令行参数个数,argv是

Python QT实现A-star寻路算法

目录 1、界面使用方法 2、注意事项 3、补充说明 用Qt5搭建一个图形化测试寻路算法的测试环境。 1、界面使用方法 设定起点: 鼠标左键双击,设定红色的起点。左键双击设定起点,用红色标记。 设定终点: 鼠标右键双击,设定蓝色的终点。右键双击设定终点,用蓝色标记。 设置障碍点: 鼠标左键或者右键按着不放,拖动可以设置黑色的障碍点。按住左键或右键并拖动,设置一系列黑色障碍点