如何覆盖 closeEvent 函数以使其工作

How to do override closeEvent functions to make it working

我正在使用 pyside2 和 pyqt5 库加载我的 UI 文件。

from PySide2 import QtWidgets
from PySide2.QtWidgets import QApplication
from PySide2.QtUiTools import QUiLoader

class A(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(A, self).__init__(parent)
        self.ui = QUiLoader().load('uiFile.ui')
    
    def closeEvent(self, event):
        event.ignore()


app = QApplication([])
mainWin = A()
mainWin.ui.show()
app.exec_()

在我看来,当我点击X按钮时它会显示'11111'。 但是,它根本不起作用。

here is the ui file

问题是“A”是一个未显示的小部件,它不是 window,因此覆盖 closeEvent 没有意义。相反,您应该使用事件过滤器来监视 window 的事件。

from PySide2.QtCore import QEvent, QObject
from PySide2.QtWidgets import QApplication
from PySide2.QtUiTools import QUiLoader


class Manager(QObject):
    def __init__(self, ui, parent=None):
        super(Manager, self).__init__(parent)
        self._ui = ui

        self.ui.installEventFilter(self)

    @property
    def ui(self):
        return self._ui

    def eventFilter(self, obj, event):
        if obj is self.ui:
            if event.type() == QEvent.Close:
                event.ignore()
                return True
        super().eventFilter(obj, event)


def main():
    app = QApplication([])
    manager = Manager(QUiLoader().load("uiFile.ui"))
    manager.ui.show()
    app.exec_()


if __name__ == "__main__":
    main()

如果您想覆盖 .ui 中使用的 QMainWindow 的 closeEvent 方法,那么您必须提升它并注册它,如 所示。