Qt事件处理的顺序

 Qt 的事件处理,实际上是有五个层次:

1. 重写paintEvent()mouseXXXEvent()等事件处理函数。这是最普通、最简单的形式,同时功能也最简单。

2. 重写event()函数。event()函数是所有对象的事件入口,QObjectQWidget中的实现,默认是把事件传递给特定的事件处理函数。

3. 在特定对象上面安装事件过滤器。该过滤器仅过滤该对象接收到的事件。

4. QCoreApplication::instance()上面安装事件过滤器。该过滤器将过滤所有对象的所有事件,因此和notify()函数一样强大,但是它更灵活,因为可以安装多个过滤器。全局的事件过滤器可以看到 disabled 组件上面发出的鼠标事件。全局过滤器有一个问题:只能用在主线程。

5. 重写QCoreApplication::notify()函数。这是最强大的,和全局事件过滤器一样提供完全控制,并且不受线程的限制。但是全局范围内只能有一个被使用(因为QCoreApplication是单例的)

示例如下:

 

mainwindow.cpp 内容

 

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

#include <QMouseEvent>

#include <QDebug>

class Widget : public QWidget
{
public:
    Widget()
    {
        installEventFilter(this);
    }
    bool eventFilter(QObject *watched, QEvent *event)
    {
        if (watched == this)
        {
            if (event->type() == QEvent::MouseButtonPress)
            {
                qDebug() << "2 eventFilter";
            }
        }
        return false;
    }
protected:
    void mousePressEvent(QMouseEvent *)
    {
        qDebug() << "4 mousePressEvent";
    }
    bool event(QEvent *e)
    {
        if (e->type() == QEvent::MouseButtonPress)
        {
            qDebug() << "3 event";
        }
        return QWidget::event(e);
    }
};

class EventFilter : public QObject
{
public:
    EventFilter(QObject *watched, QObject *parent = 0) : QObject(parent), m_watched(watched) { }
    bool eventFilter(QObject *watched, QEvent *event)
    {
        if (watched == m_watched)
        {
            if (event->type() == QEvent::MouseButtonPress)
            {
                qDebug() << "1 QApplication::eventFilter";
            }
        }
        return false;
    }
private:
    QObject *m_watched;
};

#endif // MAINWINDOW_H


 

mainwindow.h内容
#include "mainwindow.h"
main.cpp 内容
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    a.installEventFilter(new EventFilter(&w, &w));
    w.show();
    return a.exec();
}
运行结果:

Starting D:\QtWorkSpace\A_Test\QEvent\QEventLayer_Test_12345_Good\build-QEventLayer_Test_12345_Good-Desktop_Qt_5_8_0_MinGW_32bit-Debug\debug\QEventLayer_Test_12345_Good.exe...

1 QApplication::eventFilter

2 eventFilter

3 event

4 mousePressEvent

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值