【问题标题】:How to react to 'Close window' in right-click menu of task bar in Windows如何对 Windows 任务栏右键菜单中的“关闭窗口”做出反应
【发布时间】:2015-05-13 14:07:22
【问题描述】:

使用 Qt 5.3.0 和 Windows 8.1:

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

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

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

任何想法如何解决此问题?

【问题讨论】:

    标签: windows qt qt5


    【解决方案1】:

    您看到的行为并不令人惊讶。事实上,这正是像记事本这样(大部分)表现良好的 Windows 应用程序所发生的情况,所以我不确定我是否会称其为错误。

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

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

    但如果您打开了一个模态对话框,主窗口将被禁用,因此不会收到消息。

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

    【讨论】:

    • 从可用性的角度来看,这有点不幸,但考虑到您的解释,这是有道理的,至少我可以指出本机应用程序的行为相同,以防有人抱怨:)
    • 同意。尽可能避免使用模式对话框的另一个原因。
    【解决方案2】:

    如果您通过 QDialog::show() 调用您的 QDialog,并将 MainWindow 作为父窗口 (QDialog *dialog = new QDialog(this)),其中 this 是指向您的 MainWindow 的指针,它将起作用。但是,对话框将不再是模态的。我不知道模态对你来说是否重要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-18
      • 1970-01-01
      • 2013-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-30
      • 1970-01-01
      相关资源
      最近更新 更多