- 先执行全局过滤器
- 上一步返回false 则 执行 receiver 上注册的事件过滤器
- 上一步返回false 这 执行 receiver 的 event 事件处理函数,根据具体事件类型执行 具体事件处理器函数 如:MousePressEvent(QEvent* e)
- 根据上一步receiver 的event() 返回值 res 和 MousePressEvent中是否调用了 e->accept() 来决定后续处理。如果
res为true 且 执行了 e->accept() 则事件处理完成,中断返回。
- 如果步骤5中res为false 或者 执行的是 e->ignore() 则 将事件传递给 组件的父组件 重复从 步骤 1 开始的所有流程。
class QtWidgetsApplication1 : public QMainWindow
{
Q_OBJECT
public:
QtWidgetsApplication1(QWidget *parent = nullptr);
~QtWidgetsApplication1();
private:
Ui::QtWidgetsApplication1Class ui;
public slots:
void changelabel();
};
QtWidgetsApplication1::QtWidgetsApplication1(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
QObject::connect(ui.pushButton, SIGNAL(pressed()),this, SLOT(changelabel()));
}
void QtWidgetsApplication1::changelabel()
{
ui.label->setText(QString("clicked"));
}
class GlobalEventFilter : public QObject
{
public:
virtual bool eventFilter(QObject* watched, QEvent* event) override
{
qDebug() << "watched : " << watched << " event : " << event->type();
return false;
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QtWidgetsApplication1 w;
a.installEventFilter(new GlobalEventFilter());
w.show();
return a.exec();
}