如何对“关闭”窗口做出反应'在Windows的任务栏的右键菜单中

时间:2015-05-13 14:07:22

标签: windows qt qt5

使用Qt 5.3.0和Windows 8.1:

不知道我是否遗漏了某些东西,或者这是否是Qt中的疏忽,但当我只有一个QMainWindow打开QDialog(使用exec())然后尝试使用&时#39;关闭窗口' Windows任务栏图标的右键菜单功能(当对话框仍处于打开状态时),应用程序未按预期关闭,但没有任何反应。我也没有在QDialog或QMainWindow中获得closeEvent。

当只有QMainWindow打开时,应用程序成功关闭,我也得到了一个closeEvent。

这实际上也是可重复的,例如使用Qt Designer并打开一个额外的对话框,然后尝试使用“关闭”窗口'功能

如何解决此问题?

2 个答案:

答案 0 :(得分:5)

您所看到的行为并不令人惊讶。事实上,它恰好是一个(大多数)表现良好的Windows应用程序(如记事本)所发生的事情,因此我不确定我是否会将其称为错误。

打开记事本,然后选择帮助 - >关于获取模式对话框。现在从任务栏图标中选择关闭。没有任何事情发生。

任务栏中的关闭被发送到主窗口,就像用户从"系统"中选择了关闭选项一样。菜单。它作为带有SC_CLOSE的WM_SYSCOMMAND到达。如果你没有明确地处理它,那么DefWindowProc将它变成WM_CLOSE消息,大多数主窗口都会处理它。

但如果您打开了模态对话框,则主窗口将被禁用,因此无法获取消息。

修复它的一种方法是不使用模态对话框,而是使用无模式对话框模拟模态。这将允许主窗口接收和响应消息。但对于一个小修复来说,这将是很多工作。

答案 1 :(得分:2)

如果您通过QDialog通过QDialog::show()调用MainWindow作为父级(QDialog *dialog = new QDialog(this)),其中this是指向您的MainWindow的指针,则可以正常工作。然而,对话框不再是模态的。我不知道你的情况是否重要。