如何捕获PyQt的closeEvent并将对话框最小化而不是退出?

12

我有一个QDialog对象。当用户点击“X”按钮或按下“Ctrl+Q”时,我想将对话框放到最小化视图或系统托盘图标中,而不是关闭。我该怎么做?


1
你只需要在子类中重新实现 closeEvent(event) 方法,将对话框最小化而不是接受该事件。 或者你的意思是其他的? - Bakuriu
好的,你能给我展示一些代码示例吗?我尝试做了类似这样的事情,但我的程序仍然会关闭! - Shahin
1个回答

26

以下是一个简单的子类,它最小化而不是关闭:

class MyDialog(QtGui.QDialog):
    # ...
    def __init__(self, parent=None):
        super(MyDialog, self).__init__(parent)

        # when you want to destroy the dialog set this to True
        self._want_to_close = False

    def closeEvent(self, evnt):
        if self._want_to_close:
            super(MyDialog, self).closeEvent(evnt)
        else:
            evnt.ignore()
            self.setWindowState(QtCore.Qt.WindowMinimized)
你可以在交互式解释器中使用以下片段来测试它:
>>> from PyQt4 import QtCore, QtGui
>>> app = QtGui.QApplication([])
>>> win = MyDialog()
>>> win.show()
>>> app.exec_()   #after this try to close the dialog, it wont close bu minimize

谢谢你的帮助。我找到了答案。我不知道为什么 Qt.WindowMinimized 对我无效。我使用了 self.setVisible(False) 代替它。另外,因为我使用了 QDialog,在某些窗口管理器中,用户可以使用 Esc 键关闭对话框。因此,我重新实现了 done 函数并使它们相同。 - Shahin
1
在文档中他们说窗口状态的处理方式在不同的操作系统上是不同的。在某些操作系统上,更改不是即时的等等。我尝试了这个解决方案,在Linux上运行良好。 - Bakuriu
这将关闭主窗口,如何防止它关闭主应用程序? - jsibs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接