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