首页 > 解决方案 > 单击x按钮时如何隐藏/最小化窗口

问题描述

背景:当单击“x”按钮而不是关闭整个应用程序时,隐藏自身(或将其最小化,或仅关闭“主窗口”)的应用程序很常见。在mac中,关闭窗口是“command+w”,而关闭应用程序是“command+q”。它们不一样。

问题:closeEvent不足。在 PyQT5 中,wo 可以在任何 QWindow/QDialog/QWidget 中挂钩 closeEvent 并拒绝该事件。我们可以通过隐藏窗口self.hide()

def closeEvent(self, event):
  event.reject()
  self.hide()

但是,如果我们这样做,窗口将变得无法停止,因为其他关闭方式(Command+Q 或右键单击图标然后退出或通过菜单栏退出)都被阻止。(这很有趣,因为无论如何都无法关闭该应用程序。)

潜在的解决方案:

  1. 隐藏 x 按钮。这是一种权宜之计,但没有解决这个问题,因为我想要的是通过 x 按钮隐藏窗口而不是删除按钮。
  2. 找到一个不同于 closeEvent 的事件,它可以将 X 按钮与其他按钮区分开来并阻止该事件。但很遗憾,我看不到这样的事件。如果存在该事件,也许我会有另一个问题[1]
  3. 继续阻塞closeEvent,并hook其他绑定到“command+Q”或“右键退出”的事件。然后在那个偶数钩子中强制退出应用程序。在这种情况下,我的问题变成:我可以通过一些 Qt 对象连接退出或 (command+Q)吗?
  4. 也许还有其他更好的解决方案。

这篇文章可能类似于How to write event for window close(X) button in pyqt4 python但与“如何使用 Qt 禁用窗口的关闭按钮”的所谓“重复”完全不同

[1]。这不是一个大问题,但相关。一旦窗口被隐藏,我们需要一个“单击任务栏/停靠栏中的图标”事件来显示它。是否有一些对象绑定到事件?

标签: pythonmacospyqtevent-handlingpyqt5

解决方案


尝试设置WA_QuitOnClose为 False。以下对我有用:

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = QMainWindow()
    window.setCentralWidget(QWidget())
    window.setAttribute(Qt.WA_QuitOnClose, False)
    QShortcut(QKeySequence.Close, window, window.close)
    window.show()
    sys.exit(app.exec_())

推荐阅读