PyQt 用 eventFilter 拦截子控件的响应

网上找不到关于 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,就能防止该事件被子控件得到。这样就实现了在父控件里处理用户输入事件的目的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 句子翻译 1. Stagnation, both political and economic, has been...
    潘慧_06b3阅读 3,047评论 0 0
  • 我们彼此都是谁的谁? 你是我的爱人,我是你的谁? 你是我的情牵,我是你的谁? 我是你的依靠,你是我的谁? 我是你的...
    小木木加道阅读 1,735评论 0 2
  • 1 双路等于双核么? 问题:常听说双路至强XX式服务器,最近又出现了双核至强,都是两个CPU,是不是双路等于双核?...
    dingdianzhuhe阅读 2,383评论 0 0
  • 队列是一种先进先出的线性数据结构。 队列的主要操作的是入队和出队,需要从一端进入,从另外一端出去。 Queue接口...
    代夫阿普曼阅读 3,658评论 0 2