Qt | 关于如何使用事件过滤器 eventFilter
前言:
Qt 提供的事件过滤器是由两个函数组成的用来实现在一个部件中监控自己或其他多个部件的事件的一个操作。这两个函数分别是 installEventFilter()和 eventFilter(),都是 QObject 类中的函数。
使用方法:
1. 对需要监控的部件安装过滤器,例如:
ui->textEdit->installEventFilter(this);//为编辑部件在本窗口上安装事件过滤器
要对一个部件使用事件过滤器,就要先使用其的 installEventFilter()函数为其安装事件过滤器,这个函数的参数表明了监视对象。参数为 this 表明要在本窗口/部件中监视 textEdit 的事件。
2. 在监视部件中重新实现 eventFilter()函数:
bool eventFilter(QObject *obj, QEvent *event);
obj 为发生事件的对象,event 为事件。
如果要对一个特定的事件进行处理,而且不希望它在后面的传递过程中再被处理,那么就返回 true,否则返回 false。如果不需要处理这个事件,那么久返回这个事件,交给上级部件处理。
为什么要使用过滤器:
有时候,我们需要监听多个部件的事件,如果不使用过滤器,那么就得分别子类化各个部件,然后重新实现它们对应的各个事件处理函数,这样做就会很麻烦,为了避免造成这种麻烦,直接将这些部件的事件在父窗口中进行监听并做相应的处理,就会很方便。
发送事件:
Qt 中除了可以监听事件,也提供了发送一个事件的功能:
bool QCoreApplication::sendEvent(QObject *receiver, QEvent *event);
或
void QCoreApplication::postEvent(QObject *receiver, QEvent *event, int priority = Qt::NormalEventPriority);
用过 MFC 的童鞋看到这两个函数应该会联想到 SendMessage 和 PostMessage 吧,它们确实是类似的。
sendEvent 和 postEvent 的区别:
sendEvent()会立即处理给定的事件;而 postEvent()则会将事件放到等待调度队列中,当下一次 Qt 的主事件循环运行时才会处理它。
sendEvent()中的 QEvent 队形参数在事件发送完成后无法自动删除,所以需要在栈上创建 QEvent 对象;而 postEvent()中的 QEvent 对象参数必须在堆上进行创建(例如使用 new),当事件被发送后事件队列会自动删除它。
发送一个事件:
这里的 qApp 是 QApplication 对象的全局指针,每一个应用程序只能使用一个 QApplication 对象,等价于使用 QApplication::sendEvent()。
Qt 还可以使用自定义的事件,这个事件需要继承 QEvent 类。
版权声明: 本文为 InfoQ 作者【YOLO.】的原创文章。
原文链接:【http://xie.infoq.cn/article/cda4a3624339af7119843d8be】。未经作者许可,禁止转载。
评论