最近遇到一个朋友,问了我一个刁钻的问题,当你模态弹出一个窗体时,后台把这个窗体的父类给析构了,这个时候会出现什么样的情况?

听到问题后我真是一脸懵逼呀!从来没有这么写过代码。

随后写了一个简单的测试demo,跟踪了下Qt的源码,得出如下结论:

  1. 首先程序不会崩溃
  2. 模态窗口会被析构并关闭

带着这两个问题我们来研究下Qt的代码

1、测试代码

测试代码超级简单,就是当我们的模态窗体弹出时,使用定时器10s后析构了其父类obj对象

QPushButton * obj = new QPushButton;
QTimer::singleShot(10000, this, [&obj]() {
delete obj;
obj = nullptr;
});
QDialog * p = new QDialog(obj);
p->exec();

2、堆栈调用

首先我们来看下模态窗口析构时,是由谁触发的,如下图所示,从堆栈可以很清楚的看到是父类按钮析构时,析构其所有子窗口干的。

3、分析代码

a、QDialog::exec

int QDialog::exec()
{
...
QEventLoop eventLoop;
d->eventLoop = &eventLoop;
(void) eventLoop.exec(QEventLoop::DialogExec);
...
}

当我们调用QDialog的exec方法时,内部开启了一个QEventLoop事件循环

b、QEventLoop::exec

int QDialog::exec()
{
...
while (!d->exit.loadAcquire())
processEvents(flags | WaitForMoreEvents | EventLoopExec);
...
}

这个方法里边就是一直死循环处理我们的事件,当d->exit.loadAcquire()返回不为false时,事件循环退出,也就是我们的模态窗体要关闭了。

下面我们来分析d->exit.loadAcquire()这个接口为什么返回了真

首先我给所有调用d->exit.storeRelease方法的地方都打了断点,发现是在QEventLoop::exit函数中命中断点,看了下调用堆栈,没毛病,一切正常。

Qt疑难问题-模态窗口父类被析构的更多相关文章

  1. Qt 之 模态、非模态、半模态窗口的介绍及 实现QDialog的exec()方法

    一.简述 先简单介绍一下模态与非模态对话框. 模态对话框 简单一点讲就是在弹出模态对话框时,除了该对话框整个应用程序窗口都无法接受用户响应,处于等待状态,直到模态对话框被关闭.这时一般需要点击对话框中 ...

  2. QT笔记之模态对话框及非模态对话框

    模态对话框(Modal Dialog)与非模态对话框(Modeless Dialog)的概念不是Qt所独有的,在各种不同的平台下都存在.又有叫法是称为模式对话框,无模式对话框等.所谓模态对话框就是在其 ...

  3. Qt 窗体的模态与非模态(setWindowFlags(Qt::WindowStaysOnTopHint);比较有用,还有Qt::WA_DeleteOnClose)

    概念 模态对话框(Modal Dialog)与非模态对话框(Modeless Dialog)的概念不是Qt所独有的,在各种不同的平台下都存在.又有叫法是称为模式对话框,无模式对话框等. 1. 模态窗体 ...

  4. Qt创建停靠悬浮窗口

    1.Qt实现窗口停靠和悬浮使用类QDockWidget,它有两个重要方法用来设置停靠特性以及停靠区域, dw1->setFeatures(QDockWidget::DockWidgetMovab ...

  5. 34.qt quick-Popup弹出窗口自定义

    1.Popup介绍 Popup是一个弹出窗口的控件它的常用属性如下所示: anchors.centerIn : Object,用来设置居中在谁窗口中. closePolicy : enumeratio ...

  6. 用JqueryUI的Dialog+IFrame实现仿模态窗口效果

    大家有没有想过这样一个问题,当我点击某个图片的时候,我想弹出这个图片信息的详情并修改,于是你首先想到的是不是window.open?window.open方法确实可以,但是有它的局限性,比如,标题显示 ...

  7. JS弹出模态窗口下拉列表特效

    效果体验:http://hovertree.com/texiao/js/20/ 或者扫描二维码在手机体验: 点击选择城市后,在弹出的层中的输入框,输入英文字母 h,会有HoverTree和Hewenq ...

  8. AnimatedModal.js – CSS3 全屏模态窗口

    AnimatedModal.js 是一个用来创建一个全屏模态窗口的 jQuery 插件,基于 CSS3 过渡实现.您可以利用 Animate.css 中的转换或自行创建自己的过渡效果.支持 Firef ...

  9. 模态窗口用webdriver定位不到,可用java+sikuli实现

    一.安装sikuli(参见:http://lijunwei1228ok.blog.163.com/blog/static/97383797201311279595821/) 1.官网:http://w ...

随机推荐

  1. python webdriver 常用元素操作

    1.新建实例 xx_driver = os.path.abspath(r"路径") os.environ["webdriver.xx.driver"] = xx ...

  2. LoRa硬件调试-前导码

    前言 已知LoRa数据包在负载之前会有一段前导码,接收端是先检测前导码,收到前导码之后才认为有数据发送过来. 那么不同的前导码的长度会有什么影响呢? 前导码长短的优劣势 - 前导码实际上是占符号的,也 ...

  3. Java web部分-面试题

    1.Tomcat的优化经验 答:去掉对web.xml的监视,把jsp提前编辑成Servlet. 有富余物理内存的情况,加大tomcat使用的jvm的内存 2.Servlet的生命周期 答:servle ...

  4. 集群、限流、缓存 BAT 大厂无非也就是这么做

    前言 前阵子有网友询问,如何优化网站?这个问题真的很大,跟他简单的聊了一下,随便说了几点,觉得有必要整理一篇文章出来,正好前阵子在做爬虫博客,于是把大体思路分享出来,与大家互通有无,共同进步. 优化 ...

  5. Go 面试每天一篇(第 1 天)

    下面这段代码输出的内容 package main import ( "fmt" ) func main() { defer_call() } func defer_call() { ...

  6. 浏览 GitHub 太卡了?教你两招!

    老实说,GitHub 在国内的使用体验并不算太好,这其中最大的原因就是网络了. GitHub 访问起来比较卡,这个看起来貌似无解.国内的 gitee 网速倒是可以,但是无法代替 GitHub,个人感觉 ...

  7. spss数据分析可以被人工智能替换吗

    作为一名需要对课题进行研究的大学生,我在日常学习中经常需要用到spss,虽然老师上课已经初步教了我如何用这个软件,然而,在使用过程中我还是遇到了许多问题.具体来说,就是这个软件在很多地方都不够与时俱进 ...

  8. 答辩过了,但我知道我写的是一坨shi

    如果时间可以重来, 请好好珍惜大学里最重要的一份答卷. 以后的你会发现, 这种完全独立做出科研成果的机会, 可能不会再有. 1.保研了,才发现科研是多么难的一件事. 一直以来,读的喜欢的专业,考试成绩 ...

  9. 牛客小白月赛6 B 范围 数学

    链接:https://www.nowcoder.com/acm/contest/135/B来源:牛客网 题目描述 已知与均为实数,且满足: 给定A,B,求x的取值范围? 由于Apojacsleam的计 ...

  10. 调用arcpy包批量进行矢量掩膜提取

    使用一个polygon矢量提取某个文件夹中所有的tif格式栅格数据 (要确保先安装好arcpy包) import arcpy arcpy.CheckOutExtension("spatial ...