Как поймать pyqt closeEvent и свернуть диалоговое окно вместо выхода?

У меня есть объект QDialog. Когда пользователь нажимает кнопку X или нажимает Ctrl+Q, я хочу, чтобы диалоговое окно переходило в свернутое представление или значок на панели задач, а не закрывалось. Как я могу это сделать?


person Shahinism    schedule 11.09.2012    source источник
comment
Вам просто нужно повторно реализовать метод closeEvent(event) в подклассе и свернуть диалоговое окно вместо того, чтобы принимать это событие. Или вы имеете в виду что-то другое?   -  person Bakuriu    schedule 11.09.2012
comment
Хорошо, но не могли бы вы показать мне пример кода? Я пытался сделать что-то подобное, но моя программа все равно закрывается!   -  person Shahinism    schedule 11.09.2012


Ответы (1)


Простой подкласс, который сворачивает, а не закрывает, выглядит следующим образом:

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
person Bakuriu    schedule 11.09.2012
comment
Спасибо, что помогли мне. Я нашел свой ответ. Я не знаю, почему Qt.WindowMinimized у меня не сработало. Я использовал self.setVisible(False) вместо этого. Также, поскольку я использовал QDialog, в некоторых оконных менеджерах пользователь может закрыть диалог с помощью Esc key. затем я повторно реализую функцию done и делаю их одинаковыми. - person Shahinism; 11.09.2012
comment
В документации говорится, что способ обработки состояния окна в ОС отличается. В некоторых ОС изменение происходит не мгновенно и т. д. Я пробовал это решение и отлично работал в Linux. - person Bakuriu; 11.09.2012
comment
Это закрывает главное окно, как вы предотвращаете закрытие основного приложения? - person jsibs; 23.07.2021