我是靠谱客的博主 碧蓝外套,最近开发中收集的这篇文章主要介绍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:QtWorkSpaceA_TestQEventQEventLayer_Test_12345_Goodbuild-QEventLayer_Test_12345_Good-Desktop_Qt_5_8_0_MinGW_32bit-DebugdebugQEventLayer_Test_12345_Good.exe...

1 QApplication::eventFilter

2 eventFilter

3 event

4 mousePressEvent

 

 

最后

以上就是碧蓝外套为你收集整理的Qt事件处理的顺序的全部内容,希望文章能够帮你解决Qt事件处理的顺序所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(35)

评论列表共有 0 条评论

立即
投稿
返回
顶部