事情是这样的:今天调试窗体,突然发现按ESC键居然跳过closeEvent()关闭了对话框!我的关闭判断都在closeEvent()里,这直接导致非正常关闭了正在进行的工作。先重建下场景:

调用处:

{
    Corpus corpusDialog(this);
    corpusDialog.exec();
}

典型的模态对话框,因为用了exec()。Corpus对话框类中覆盖了closeEvent(),其中父类的closeEvent()为虚函数。这样,当我按ESC关闭对话框就出现了如题情景。

后来发现,居然是因为Corpus类中没有覆盖reject()函数导致的!由Qt官方文档:

Escape Key

If the user presses the Esc key in a dialog, QDialog::reject() will be called. This will cause the window to close: The close event cannot be ignored.

得知按ESC默认调用的是reject()函数。由于Corpus类中没有覆盖,直接调用了父类QDialog的reject()。调用QDialog的reject()会发生什么呢?

它实际调用了done(QDialog::Reject)(同样由于没有被覆盖,调用的是QDialog的done)。由Qt官方文档:

void QDialog::done ( int r )  [virtual slot]

Closes the dialog and sets its result code to r. If this dialog is shown withexec(), done() causes the local event loop to finish, and exec() to return r.

看不出done()到底做了些什么。调试跟踪了一圈,发现就我这种情况来讲

  • done(QDialog::Reject)仅hide了对话框,
  • 然后设置了exec()返回值为QDialog::Reject,
  • 关闭窗体事件循环(这个看不出,估计的),
  • 释放finished(QDialog::Reject)信号,
  • 最后释放rejected()信号。

的却没有关闭窗体呀,所以也不会触发closeEvent()。我应当在Corpus类中覆盖掉reject(),由reject()调用close()。这样就把问题解决了!

void Corpus::reject()
{
    close();
}
 
 
http://www.cnblogs.com/codingmylife/archive/2010/04/29/1724571.html

Qt按ESC关闭模态对话框不触发closeEvent()问题解析(ESC默认调用的是reject()函数,所以必须覆盖这个函数才会有效果)good的更多相关文章

  1. QT之两种模态对话框的调用

    模态对话框:就是没有关闭它之前,不能再与同一个应用程序的其他窗口进行交互. 1.show调用 LoginDialog *dlg = new LoginDialog(); dlg->setModa ...

  2. QDialog 模态对话框与事件循环(exec其实就是调用了show和eventLoop.exec)

    起源 qtcn中文论坛中有网友问到: 假设程序正常运行时,只有一个简单的窗体A,此时只有一个GUI主线程,在这个主线程中有一个事件循环处理窗体上的事件.当此程序运行到某阶段时,弹出一个模态窗体B(书上 ...

  3. Qt的模态对话框和非模态对话框 经常使用setAttribute (Qt::WA_DeleteOnClose)

    模态对话框就是指在子对话框弹出时,焦点被强行集中于该子对话框,子对话框不关闭,用户将无法操作其他的窗口.非模态相反,用户仍然可以操作其他的窗口,包括该子对话框的父对话框. 如果从线程角度来讲,模态对话 ...

  4. Qt对话框之二:模态、非模态、半模态对话框

    一.模态对话框 模态对话框:阻塞同一应用程序中其它可视窗口输入的对话框.模态对话框有自己的事件循环,用户必须完成这个对话框中的交互操作,并且关闭了它之后才能访问应用程序中的其它任何窗口. 显示模态对话 ...

  5. DirectUI中模态对话框和菜单的原理(自己控制整个Windows消息循环。或者,用菜单模拟窗体打开时用SetCapture取得控制权,一旦窗体收到WM_CAPTURECHANGED消息就把窗体退出)

    经常有人问关于模态对话框和系统菜单内部实现原理方面的问题, 因为系统通过API隐藏了太多细节,这2个问题确实令初学者甚至是有经验的开发者困扰, 下面是我个人的一些经验总结. 先说模态对话框,外部看模态 ...

  6. Qt5教程: (7) 模态/非模态对话框

    模态对话框就是在其没有被关闭之前,用户不能与同一个应用程序的其他窗口进行交互,直到该对话框关闭. 非模态对话框就是在被打开时,用户既可选择和该对话框进行交互,也可以选择同应用程序的其他窗口交互. 1. ...

  7. MFC编程 | 非模态对话框的定义

    因为课程需要,会用到MFC编程,所以讲一些经验总结下,以便日后使用查询. // 非模态对话框的定义 // 通过单文档菜单调用一个非模态窗口 1.首先在工程里插入一个对话框(如:IDD_DLG_TEST ...

  8. VC++模态对话框和非模态对话框

    MFC中有两种类型的对话框:模态对话框和非模态对话框.  模态对话框是指当其显示时,程序会暂停执行,直到关闭这个模态对话框后,才能继续执行程序中其他任务.非模态对话框是指当其显示时,允许转而执行程序中 ...

  9. html5各种页面切换效果和模态对话框

    页面动画:data-transition 属性可以定义页面切换是的动画效果.例如:<a href="index.html" data-transition="pop ...

随机推荐

  1. C# 反射调用私有事件

    原文:C# 反射调用私有事件 在 C# 反射调用私有事件经常会不知道如何写,本文告诉大家如何调用 假设有 A 类的代码定义了一个私有的事件 class A { private event EventH ...

  2. 加减密 DES

    /**//// <summary> /// DES /// </summary> public class DES_ { private DES mydes; public s ...

  3. 度小于所述过程:KanboxEnt.exe

    在防火墙管理.见未知的过程"KanboxEnt.exe" 程序信息: 版权声明:本文博主原创文章.博客,未经同意不得转载.

  4. Spring boot配置说明

    要加“m”说明是MB,否则就是KB了. -Xms:初始值 -Xmx:最大值 -Xmn:最小值 java -Xms80m -Xmx80m -jar mod.jar 时区设置 java -jar -Dus ...

  5. Android-apktool反汇编异常-Input file (XXX) was not found or was not readable.

    问题描述: 原因: 在apptool 2.0以后命令发生了变化,不能再使用 apktool d <apk_path> <outfile_path> 解决方法:解决方法: 使用命 ...

  6. 矿Spring入门Demo

    第一步:输入Spring jar 包裹 Spring核心包(4个)  日志包(2个)  jdbc模板支持(1个)  spring-jdbc-3.2.0.RELEASE.jar  模板相关事务处理包(1 ...

  7. 开始使用Material UI

    Material-UI采用 Material Design风格的React UI组件,所以要想学习material ui先要了解react. material ui安装 Material-UI 可以使 ...

  8. java项目采用exe4j打包成exe档

    java项目采用exe4j打包成exe档 前言:我们都知道java是平台无关性.能够打包成jar文件,到不论什么操作系统有jre环境的电脑都能够同意!可是我们打包成exe文件就相当于舍弃了这一大优势, ...

  9. Win32 Windows计划 十一年

    一个.使用位图 1 位图 - 由图像上的各点的颜色被保存,生成对应的位图文件 栅格 - 保存图像可以理解为晶格 矢量图 - 能够理解为画图命令的保存 2 位图的使用 2.1 载入位图 LoadBitm ...

  10. Beginner’s Tutorial: 3D Line and Border Effects in XAML

    This mini-tutorial might be for you if you’re having troubles finding the right line colors to achie ...