Qt 事件处理

  1. 先执行全局过滤器
  2. 上一步返回false 则 执行 receiver 上注册的事件过滤器
  3. 上一步返回false 这 执行 receiver 的 event 事件处理函数,根据具体事件类型执行 具体事件处理器函数 如:MousePressEvent(QEvent* e)
  4. 根据上一步receiver 的event() 返回值 res 和 MousePressEvent中是否调用了 e->accept() 来决定后续处理。如果
    res为true 且 执行了 e->accept() 则事件处理完成,中断返回。
  5. 如果步骤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();
}

posted @ 2024-09-18 14:37  MarsCactus  阅读(24)  评论(0编辑  收藏  举报