当前位置:   article > 正文

QT基础 - 事件过滤机制_qt 事件过滤机制

qt 事件过滤机制

#QT基础 - 事件过滤机制

如需转载请标明出处: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);
  • 1

事件过滤器是接收发送到此对象的所有事件的对象。 过滤器可以停止事件或将其转发给此对象。 事件过滤器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);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

以下是如何将它安装在两个widget上:

KeyPressEater *keyPressEater = new KeyPressEater(this);
QPushButton *pushButton = new QPushButton(this);
QListView *listView = new QListView(this);

pushButton->installEventFilter(keyPressEater);
listView->installEventFilter(keyPressEater);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

例如,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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/573951
推荐阅读
相关标签
  

闽ICP备14008679号