QT基础 - 事件过滤机制

标签: eventFilter 事件过滤器 installEventFilter
8人阅读 评论(0) 收藏 举报
分类:

QT基础 - 事件过滤机制


如需转载请标明出处:http://blog.csdn.net/itas109
QQ技术交流群:12951803

目录


环境:
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技术交流群:12951803

查看评论

Android Activity intent-flilter过滤机制

在Android中一个应用(APP1)如果要想调用另一应用的(APP2)的某一个Activity(Activity2),就需要在给Intent设置的参数能够通过Activiy2 在清单文件中声明的属性...
  • yifei1989
  • yifei1989
  • 2015-01-09 19:28:26
  • 981

[android]关于GooglePlay过滤机制的说明

前段时间移植神念系统需要使用到bluetooth功能,现将移植过程中碰到的问题简要列一下,备忘而已。 1、内核增加配置 make menuconfig -> Networking suppor...
  • burly
  • burly
  • 2014-07-28 14:55:26
  • 1085

Java_Filter过滤机制详解.doc

  • 2011年10月26日 10:34
  • 64KB
  • 下载

Java_Filter过滤机制详解.

  • 2010年12月24日 11:42
  • 78KB
  • 下载

C++ GUI Qt 4编程

  • 2017年09月29日 15:26
  • 21.69MB
  • 下载

Qt事件和信号的区别

问题:     什么时候用事件,什么时候用信号呢?是不是不同的线程间用事件,信号不能用在线程间?解答:    仔细来看,事件与信号其实并无多大差别,从我们对其需求上来说,都只要能注册事件或信号响应...
  • wanjie518
  • wanjie518
  • 2010-12-10 09:14:00
  • 5958

IntentFilter的过滤规则

1.通过action测试的条件为: filter定义了intent的action。如果filter没有定义action, 则这个filter将阻塞所有intent。如果intent没有定义actio...
  • fenggering
  • fenggering
  • 2015-09-16 21:51:15
  • 261

php 过滤js输入 过滤脏字

/* ** 过滤一些脏词汇 ** $words 脏词汇列表 ** $replace 要替换成的词汇 ** 返回替换完的词汇 */ function replace_danger_word(...
  • cjy082322
  • cjy082322
  • 2016-08-01 14:13:53
  • 527

Qt 信号槽机制与事件机制四 提升篇

标 题: 【翻译】Qt内部机制及逆向 作 者: zouzhin 时 间: 2011-04-30,15:51:44 链 接: http://bbs.pediy.com/showthread.php...
  • xzh_blue
  • xzh_blue
  • 2015-09-09 17:23:27
  • 1213

Android系统的过滤机制大揭秘——原创

Android系统的过滤机制大揭(一)                              ——Android将军的Android自修之途 Android系统通过一些列过滤机制(Ac...
  • gc_gongchao
  • gc_gongchao
  • 2014-02-26 14:49:11
  • 1335
    公告
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 35万+
    积分: 4967
    排名: 7119
    博客专栏
    最新评论