事件在传输到组件之前可以被拦截。为此,需要从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)删除已安装的过滤器。