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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构