Qt中的事件过滤器是一个功能极其强大的模块。如果在部件上安装了事件过滤器,那么,过滤器便可以先于部件捕获事件,从而进行相应的处理。那么,Qt的事件过滤器究竟应该如何使用呢?
工具/原料
Qt
一、Qt中的事件传递顺序
1、在Qt中,当一个事件发生时(例如鼠标点击或某个键盘上的按键按下),其传递顺序如图所示。从这个图可以看出,事件过滤器首先获得事件,其次才是部件的 event 函数,最后是部件的事件处理函数。
二、与事件过滤器相关的函数
1、事件过滤器由QObject类中的两个函数来实现。一个是 installEventFilter,它负责在相应部件上安装事件过滤器,其声明为:void QObject::installEventFilter(QObject *filterObj);其中,filterObj参数表示要在其上实现事件过滤器函数的部件。请注意,如果我们在一个部件安装了事件过滤器,一般在其父控件上实现事件过滤器函数。
2、第二个函数是eventFilter 函数,我们在此函数中实现事件过滤器。请注意:1)该函数在 QObject 类中声明为一个虚函数,因此只能由 QObject 的子类继承使用2)该函数在 QObject 类中是一个保护成员,因此子类继承时不可以作为一个公有成员
三、操作示例
1、下面,我们通过一个实际例子来说明怎么使用事件过滤器。在这个例子中,我们需要对QTextEdit控件进行事件过滤,以便我们在编辑框中滚动鼠标滚轮时,便可以放大或缩小编辑框中的字符。
2、在构造函数中,我们首先在textEdit上安装事件过滤器。
3、接着,在textEdit的父部件中实现事件过滤器函数。注意,事件过滤器函数返回一个bool值,并带有两个参数,一个参数为QObject类型,表明接收事件的部件;另一个参数为QEvent类型,表示发生的事件。
4、下图便是事件过滤器的实现代码。每当发生一个事件时,我们首先判断该事件的接收者是否为textEdit,如果是,则进一步判断事件类型是否为鼠标滚轮事件。如果两者都成立,则根据鼠标滚轮的滚动方向放大或缩小编辑框中的字符内容。
5、下面是以上代码的运行效果图。