python - 单击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 或右键单击图标然后退出或通过菜单栏退出)都被阻止。(这很有趣,因为无论如何都无法关闭该应用程序。)
潜在的解决方案:
- 隐藏 x 按钮。这是一种权宜之计,但没有解决这个问题,因为我想要的是通过 x 按钮隐藏窗口而不是删除按钮。
- 找到一个不同于 closeEvent 的事件,它可以将 X 按钮与其他按钮区分开来并阻止该事件。但很遗憾,我看不到这样的事件。如果存在该事件,也许我会有另一个问题[1]
- 继续阻塞closeEvent,并hook其他绑定到“command+Q”或“右键退出”的事件。然后在那个偶数钩子中强制退出应用程序。在这种情况下,我的问题变成:我可以通过一些 Qt 对象连接退出或 (command+Q)吗?
- 也许还有其他更好的解决方案。
这篇文章可能类似于How to write event for window close(X) button in pyqt4 python但与“如何使用 Qt 禁用窗口的关闭按钮”的所谓“重复”完全不同
[1]。这不是一个大问题,但相关。一旦窗口被隐藏,我们需要一个“单击任务栏/停靠栏中的图标”事件来显示它。是否有一些对象绑定到事件?
解决方案
尝试设置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_())
推荐阅读
- java - Java EE 8 教程 - Maven 原型不存在
- amazon-web-services - Amazon S3 似乎没有触发 Lambda 函数
- python - “导入” SQLiteDatabaseBrowserPortable 应用程序模块的脚本语法是什么?
- machine-learning - “要进行任何分类或回归,我们需要全连接层作为输出层”
- sql - 使用 SQL 连接多个表
- javascript - React 从常量导入图像路径
- apply - 将带有 t(apply()) 的 for 循环从 R 转换为 C++ 以与 Rcpp 一起使用
- r - 如何将 R 脚本传递给 R Shiny
- ios - 替换 Apple 弃用的 UIApplicationDidChangeStatusBarFrameNotification API
- c++ - 如何在 QThread 和 QGui 之间传递参数?