PyQt 用 eventFilter 拦截子控件的响应
2019-09-25 本文已影响0人
Hemmelfort
网上找不到关于 PyQt 使用 eventFilter (事件过滤器)的详细介绍,只好自己动手。
🌙 近水楼台先得月,在 Qt 中,子控件往往是离事件最近的部分,每一次用户键盘或鼠标的输入都率先由子控件来响应。于是父控件就连汤都喝不上。比如以下的窗口,即使你在父窗口的 keyPressEvent
里设置好了按 Esc 键退出,但只要焦点在文本框中,这个按键就无效。
🌞 这时候就要用到 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
,就能防止该事件被子控件得到。这样就实现了在父控件里处理用户输入事件的目的。