如何覆盖 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'。
但是,它根本不起作用。
问题是“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 方法,那么您必须提升它并注册它,如 所示。
我正在使用 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'。 但是,它根本不起作用。
问题是“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 方法,那么您必须提升它并注册它,如