PyQt 用 eventFilter 拦截子控件的响应

2019-09-25  本文已影响0人  Hemmelfort

网上找不到关于 PyQt 使用 eventFilter (事件过滤器)的详细介绍,只好自己动手。

🌙 近水楼台先得月,在 Qt 中,子控件往往是离事件最近的部分,每一次用户键盘或鼠标的输入都率先由子控件来响应。于是父控件就连汤都喝不上。比如以下的窗口,即使你在父窗口的 keyPressEvent 里设置好了按 Esc 键退出,但只要焦点在文本框中,这个按键就无效。

父控件 vs 子控件

🌞 这时候就要用到 eventFilter 事件过滤器,一个比 keyPressEvent 更底层的东西。

任何一个 Qt 控件,只要定义了 eventFilter 方法,都可以被当作一个过滤器。

完整结构:

class Father(QWidget):
    def __init__(self):
        self.text_editor.installEventFilter(self)  # 把自己当成一个过滤器安装到儿子身上

    def eventFilter(self, obj, event):
        if obj == self.text_editor:
            if event.type() == QEvent.KeyPress and event.key() == Qt.Key_Escape:
                self.close()
                return True  # 说明这个事件已被处理,其他控件别插手

        return QObject.eventFilter(self, obj, event)  # 交由其他控件处理

🌟 只要在 eventFilter 中返回 True,就能防止该事件被子控件得到。这样就实现了在父控件里处理用户输入事件的目的。

上一篇 下一篇

猜你喜欢

热点阅读