穿插一讲:QObject::installFilter(QObject *filterObj)

一个事件过滤器(filterObj)是一个接受所有发往这个对象的事件。这个事件过滤器(filterObj)既可以停止这个事件,也可以把事件传播到这个对象中。事件过滤器通过eventFilter() 函数接受事件,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);
      }
  }

安装方法:

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

  pushButton->installEventFilter(keyPressEater);
  listView->installEventFilter(keyPressEater);

⚠:如果你删除接受对象中的 eventFilter() 函数, 请确保他返回true,否则, Qt 会如果向接受者中继续传播事件,就可能引起崩溃。

请注意过滤器对象必须在同一个线程中.如果不在同一个线程中就会失败.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值