就我个人而言,我从来没有使用覆盖虚拟方法的猴子修补样式,但是保留原始行为的正确方法是直接调用基类方法,如下所示:
def my_handler(self, event): QtGui.QPlainTextEdit.focusOutEvent(self.my_text_edit, event) # my own handling follows...
不过,我不明白为什么您不能使用该
focusChanged信号。它的处理程序将简单地是:
def my_handler(self, old, new): if old is self.my_text_edit: print('focus out') elif new is self.my_text_edit: print('focus in')
但是,我自己的偏好是使用事件过滤器:
class Window(QtGui.QMainWindow) def __init__(self): ... self.my_text_edit.installEventFilter(self) def eventFilter(self, source, event): if (event.type() == QtCore.QEvent.FocusOut and source is self.my_text_edit): print('eventFilter: focus out') # return true here to bypass default behaviour return super(Window, self).eventFilter(source, event)
这是一个更加灵活的解决方案,它为处理通过Qt
Designer导入的任何窗口小部件(或者实际上是您不希望子类化的任何窗口小部件)提供一种通用方法来处理任何事件类型。
还可以进行小部件升级,可以用自己的子类直接替换生成的ui模块中的小部件。然后,这将允许您通过继承覆盖任何虚拟方法,而不是通过猴子修补单个实例。如果您要从Qt
Designer导入多个具有相同自定义功能的相同类型的小部件,则可以提供非常干净的解决方案。
我对以下问题的回答提供了有关如何在PyQt中进行小部件升级的简单说明:在运行时替换QWidget对象。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)