我想替换QMainWindow
类实例中处理表单关闭事件的内置方法closeEvent
代码# 1
import sys
from PySide2.QtUiTools import QUiLoader
from PySide2.QtWidgets import QApplication
from PySide2.QtCore import QFile, QIODevice
app = QApplication(sys.argv)
ui_file_name = "uiMain.ui"
ui_file = QFile(ui_file_name)
if not ui_file.open(QIODevice.ReadOnly):
print("Cannot open {}: {}".format(ui_file_name, ui_file.errorString()))
sys.exit(-1)
loader = QUiLoader()
window = loader.load(ui_file)
ui_file.close()
if not window:
print(loader.errorString())
sys.exit(-1)
def MainFormCloseEvent(event):
print(event)
event.ignore()
print(window.closeEvent)
window.closeEvent=MainFormCloseEvent
print(window.closeEvent)
window.show()
sys.exit(app.exec_())
此代码不会导致 不,你不能用同样的方式替换方法。 虽然创建一个方法作为类属性并在运行时覆盖一个实例方法通常有类似的结果,但在较低的层次上是不一样的,这在使用复杂的模块(如python绑定到用其他语言编写的库)时是极其重要的。 一般来说,只有在安全的情况下(而且确实知道自己在做什么),才应该非常小心地覆盖方法的属性。同样重要的是要注意,为事件处理程序这样做是有风险的,它会使调试混乱,也会使调用默认实现更加复杂和尴尬(您不能调用 不幸的是,PySide不直接支持在现有的小部件实例上设置UI,这是你可以用PyQt和使用适当的类来做的,就像你的第二个例子一样),但是有一个可能的解决方案,在这篇相关的文章中解释过。 仍然,你不应该用一个基本函数覆盖MainFormCloseEvent
函数在窗体关闭时被调用。此代码打印以下信息:内置& lt;PySide2.QtWidgets的closeEvent方法。QMainWindow对象0x000000000573BF80>super()
)。class UiLoader(QtUiTools.QUiLoader):
_baseinstance = None
def createWidget(self, classname, parent=None, name=''):
if parent is None and self._baseinstance is not None:
widget = self._baseinstance
else:
widget = super().createWidget(classname, parent, name)
if self._baseinstance is not None:
setattr(self._baseinstance, name, widget)
return widget
def loadUi(self, uifile, baseinstance=None):
self._baseinstance = baseinstance
widget = self.load(uifile)
QtCore.QMetaObject.connectSlotsByName(baseinstance)
return widget
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
ui_file_name = "uiMain.ui"
ui_file = QFile(ui_file_name)
ui_file.open(QIODevice.ReadOnly)
loader = UiLoader()
loader.loadUi(ui_file, self)
def closeEvent(self, event):
print('Original class method')
closeEvent
,相反,你可能应该选择信号,进一步子类化,或实现替代方法来改变行为(即,使用实例属性)。