使用Qt 5.3.0和Windows 8.1:
不知道我是否遗漏了某些东西,或者这是否是Qt中的疏忽,但当我只有一个QMainWindow打开QDialog(使用exec())然后尝试使用&时#39;关闭窗口' Windows任务栏图标的右键菜单功能(当对话框仍处于打开状态时),应用程序未按预期关闭,但没有任何反应。我也没有在QDialog或QMainWindow中获得closeEvent。
当只有QMainWindow打开时,应用程序成功关闭,我也得到了一个closeEvent。
这实际上也是可重复的,例如使用Qt Designer并打开一个额外的对话框,然后尝试使用“关闭”窗口'功能
如何解决此问题?
答案 0 :(得分:5)
您所看到的行为并不令人惊讶。事实上,它恰好是一个(大多数)表现良好的Windows应用程序(如记事本)所发生的事情,因此我不确定我是否会将其称为错误。
打开记事本,然后选择帮助 - >关于获取模式对话框。现在从任务栏图标中选择关闭。没有任何事情发生。
任务栏中的关闭被发送到主窗口,就像用户从"系统"中选择了关闭选项一样。菜单。它作为带有SC_CLOSE的WM_SYSCOMMAND到达。如果你没有明确地处理它,那么DefWindowProc将它变成WM_CLOSE消息,大多数主窗口都会处理它。
但如果您打开了模态对话框,则主窗口将被禁用,因此无法获取消息。
修复它的一种方法是不使用模态对话框,而是使用无模式对话框模拟模态。这将允许主窗口接收和响应消息。但对于一个小修复来说,这将是很多工作。
答案 1 :(得分:2)
如果您通过QDialog
通过QDialog::show()
调用MainWindow作为父级(QDialog *dialog = new QDialog(this)
),其中this
是指向您的MainWindow的指针,则可以正常工作。然而,对话框不再是模态的。我不知道你的情况是否重要。