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);

事件过滤器是接收发送到此对象的所有事件的对象。 过滤器可以停止事件或将其转发给此对象。 事件过滤器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

猜你喜欢

转载自blog.csdn.net/itas109/article/details/79978355