小部件失去焦点时如何截取

小部件失去焦点时如何截取,第1张

部件失去焦点时如何截取

就我个人而言,我从来没有使用覆盖虚拟方法的猴子修补样式,但是保留原始行为的正确方法是直接调用基类方法,如下所示:

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对象。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5663650.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存