事件在到达某个具体的对象前,可以通过事件过滤器进行筛选处理,函数定义如下:
virtual bool eventFilter(QObject *watched, QEvent *event);
Qt帮助文档:
Filters events if this object has been installed as an event filter for the watched object. In your
reimplementation of this function, if you want to filter the event out, i.e. stop it being handled further, return true; otherwise return false.
大致意思:如果在eventFilter
函数中返回true
,表示拦截事件,不再执行watched
对象的event
函数;而返回false
,则表示除了在eventFilter
中进行相关操作后,仍旧希望执行watched
对象的event
函数;也可以在eventFilter
函数中调用父类的eventFilter
函数,交给父类来处理,父类仍旧遵循以上规则。
下面关于文档里说的返回值,进行演示说明
MyButton.h
#ifndef MYBUTTON_H
#define MYBUTTON_H#include <QPushButton>class MyButton : public QPushButton
{Q_OBJECT
public:MyButton(QWidget *parent = nullptr);~MyButton();protected:bool event(QEvent *e) override;
};#endif // MYBUTTON_H
MyButton.cpp
#include "MyButton.h"
#include <QDebug>
#include <QEvent>MyButton::MyButton(QWidget *parent) : QPushButton(parent){}MyButton::~MyButton(){}bool MyButton::event(QEvent *e)
{if (e->type() == QEvent::MouseButtonPress){qDebug() << __FUNCTION__ << event->isAccepted();}return QPushButton::event(e);
}
MainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = nullptr);~MainWindow();protected:bool eventFilter(QObject *watched, QEvent *event) override;private:Ui::MainWindow *ui;
};#endif // MAINWINDOW_H
MainWindow.cpp
#include "MainWindow.h"
#include "ui_MainWindow.h"
#include <QDebug>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);ui->pushButton->installEventFilter(this);
}MainWindow::~MainWindow()
{delete ui;
}bool MainWindow::eventFilter(QObject *watched, QEvent *event)
{if (watched == ui->pushButton){if (event->type() == QEvent::MouseButtonPress){qDebug() << __FUNCTION__ << event->isAccepted();return false;// 注意这里的返回值,影响运行结果,文章最后会提到}}return QMainWindow::eventFilter(watched, event);
}
运行结果: eventFilter函数中return false时
MainWindow::eventFilter true
MyButton::event true
运行结果: eventFilter函数中return true时
MainWindow::eventFilter true
温馨提示:请注意程序中的event->isAccepted()打印出来的值,下一篇文章将会用到。