Qt - notify函数捕获事件

Qt中可以使用notify来捕获所有的事件。如果你想要捕获事件,需要创建新的类去继承自QApplication,并重写notify函数。
需要注意,在初始化自定义类时要先初始化QApplication类(QApplication管理GUI程序的控制流和主要设置。对于用Qt写的任何一个GUI应用,不管这个应用有没有窗口或多少个窗口,有且只有一个QApplication对象。)。
具体实现代码如下:

myapplication.h

#ifndef MYAPPLICATION_H
#define MYAPPLICATION_H
#include <QApplication>

class MyApplication : public QApplication //此处需继承QApplication类
{
public:
    MyApplication(int argc, char *argv[]);
protected:

    virtual bool notify(QObject *, QEvent *);//对该类重写notify事件
};

#endif // MYAPPLICATION_H

myapplication.cpp

#include "myapplication.h"
#include <QMouseEvent>
#include <QDebug>

MyApplication::MyApplication(int argc, char *argv[]) : QApplication(argc, argv)
{

}

bool MyApplication::notify(QObject * obj, QEvent * event)
{
    if(event->type() == QMouseEvent::MouseButtonPress)
    {
        qDebug() << __PRETTY_FUNCTION__ << obj << event;
    }
    return QApplication::notify(obj, event);
}

在main.cpp中,需要使用自定义类来定义应用程序:

int main(int argc, char *argv[])
{
    MyApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

运行结果如下:

notify中的obj就是这个event的接收者。不过这里有个疑问,为何点击一次会有两次打印。

 

和eventFilter的关系:

notify()函数是在事件过滤器得到所有事件之前获得它们的唯一方法,可以在notify中屏蔽一些事件,让eventFilter捕捉不到。事件过滤器使用更为便利,因为可以同时有多个事件过滤器。而 notify()函数只有一个。

 

 

————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/Stephen___Qin/article/details/115640721

 

posted @ 2024-11-12 15:05  [BORUTO]  阅读(19)  评论(0编辑  收藏  举报