0
点赞
收藏
分享

微信扫一扫

installEventFilter函数理解

_karen 2022-02-05 阅读 22
installEventFilter函数如下:
void QObject::installEventFilter(QObject *filterObj)

Qt助手的解释如下:

在对象上安装一个事件过滤器filterObj。如下:

monitoredObj->installEventFilter(filterObj);

其中monitoredObj、filterObj都是QObject的子类。上面代码意思是:在monitoredObj对象上安装一个事件过滤器filterObj。该函数一般和如下函数配合使用:

[virtual] bool QObject::eventFilter(QObject *watched, QEvent *event)

注意:该函数是虚函数,也就是说派生自QObject的子类可以重写该函数。

     上面monitoredObj对象安装一个filterObj过滤器后,则可以在filterObj对象所在类的eventFilter函数中拦截发送到monitoredObj对象所在类的事件。如下为KeyPressEater类:


  class KeyPressEater : public QObject
  {
      Q_OBJECT
      ...

  protected:
      bool eventFilter(QObject *obj, QEvent *event) override;
  };

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

此时如果在按钮或QListView获取到键盘焦点且按下Esc键,按键事件被 KeyPressEater类的eventFilter函数拦截,从而弹出:

Ate key press 1048576

其中1048576为Esc键的虚拟键码。

注意:

举报

相关推荐

0 条评论