赞
踩
如需转载请标明出处:http://blog.csdn.net/itas109
QQ技术交流群:129518033
目录
环境:
QT版本:5.6.2
基础内容阅读:
QT基础 - QObject简介
##1.前言
所谓事件过滤就是提前截获发往某个对象的所有消息,根据需要屏蔽掉某一些,或者对某些消息提前进行些处理。比如许多浏览器都支持鼠标手势,这个其实就可以利用事件过滤器来实现。
##2.事件过滤器简介
在QT基础 - QObject简介一文中提到:
QObject可以通过event()接收事件并过滤其他对象的事件。有关详细信息,请参阅installEventFilter()和eventFilter()。可以重新实现便利处理程序childEvent()来捕获子事件。
事件过滤器使用起来就两个步骤:
第一:对目标对象调用installEventFilter()来注册监视对象(事件过滤器);
第二:重写监视对象的eventFilter()函数处理目标对象的事件。
在此对象上安装事件过滤器filterObj。 例如:
monitoredObj->installEventFilter(filterObj);
事件过滤器是接收发送到此对象的所有事件的对象。 过滤器可以停止事件或将其转发给此对象。 事件过滤器filterObj通过其eventFilter()函数接收事件。 如果应该过滤事件(即停止),则eventFilter()函数必须返回true。 否则它必须返回false。
eventFilter()的返回值,如果你想过滤出事件,即停止进一步处理,返回true; 否则返回false。
如果多个事件过滤器安装在单个对象上,则最后安装的过滤器首先被激活。
这是一个KeyPressEater类,它可以按下其监视对象的按键:
class KeyPressEater : public QObject { Q_OBJECT ... protected: bool eventFilter(QObject *obj, QEvent *event); }; bool KeyPressEater::eventFilter(QObject *obj, QEvent *event) { if (event->type() == QEvent::KeyPress) { QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event); qDebug("Ate key press %d", keyEvent->key()); return true; } else { // standard event processing return QObject::eventFilter(obj, event); } }
以下是如何将它安装在两个widget上:
KeyPressEater *keyPressEater = new KeyPressEater(this);
QPushButton *pushButton = new QPushButton(this);
QListView *listView = new QListView(this);
pushButton->installEventFilter(keyPressEater);
listView->installEventFilter(keyPressEater);
例如,QShortcut类使用这种技术来拦截快捷键按下。
警告:如果您在eventFilter()函数中删除接收器对象,请务必返回true。 如果您返回false,则Qt将该事件发送到已删除的对象,并且程序将崩溃。
请注意,过滤对象必须与此对象位于同一个线程中。 如果filterObj处于不同的线程中,则此函数不执行任何操作。 如果在调用此函数之后filterObj或此对象移动到另一个线程,那么将不会调用事件过滤器,直到两个对象再次具有相同的线程关系为止(不会被移除)。
Reference:
QT基础 - QObject简介
http://doc.qt.io/qt-5/qobject.html#eventFilter
觉得文章对你有帮助,可以扫描二维码捐赠给博主,谢谢!
如需转载请标明出处:http://blog.csdn.net/itas109
QQ技术交流群:129518033
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。