PyQt5编程(21):过滤事件

事件在传输到组件之前可以被拦截。为此,需要从QObject派生一子类并重载eventFiiter (self, object, event)。通过object参数,获得控件对象;通过event参数,获取事件的相关信息。对于不同事件,object对象也不一致。MouseButtonPress事件的对象为QMouseEvent,而 KeyPress事件的对象为QKeyEvent。

在 eventFiiter () 函数中,如果事件不再发到原目的地,返回True;否则,返回False。下面代码为拦截按下大写“B”按键的代码:
class MyFilter(QtCore.QObject):
def init(self, parent=None):
QtCore.QObject.init(self, parent)
def eventFilter(self, obj, e):
if e.type() == QtCore.QEvent.KeyPress:
if e.key() == QtCore.Qt.Key_B:
print("The event from the key will not reach the component")
return True
return QtCore.QObject.eventFilter(self, obj, e)

 第二步为安装过滤器。以过滤对象为构造函数的参数创建此派生类的实例,然后以此实例为参数,调用对象的installEventFilter函数。下面为安装QLabel过滤器的例子:
self.label.installEventFilter(MyFilter(self.label))

一个对象可多次调用installEventFilter安装多个过滤器,最后安装的,最先被调用。也可将同一过滤器安装到不同的对象。通过eventFilter函数的第二个参数,可以获得产生事件的控件引用。
调用removeEventFilter(Filter)删除已安装的过滤器。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容