qt-C++笔记之打印所有发生的事件
code review!
文章目录
- qt-C++笔记之打印所有发生的事件
- 1.ChatGPT问答
- 使用 QApplication 的 notify 方法
- 使用 QObject 的 event 方法
- 2.使用 QObject 的 event 方法
- 3.使用 QApplication 的 notify 方法
1.ChatGPT问答
在Qt C++中,若要打印所有发生的事件,您可以通过重写QObject
的event
函数或者QApplication
的notify
函数来实现。这两个方法都可以截获事件循环中的事件,但是通常更推荐使用notify
方法,因为它可以捕获到传递给任何对象的所有事件。
使用 QApplication 的 notify 方法
为了打印所有事件,您可以继承QApplication
类并重写其notify
方法。下面是一个简单的例子:
#include <QApplication>
#include <QDebug>
#include <QEvent>class MyApplication : public QApplication {
public:MyApplication(int &argc, char **argv): QApplication(argc, argv) {}bool notify(QObject *receiver, QEvent *event) override {// 打印事件类型和接收对象的名称qDebug() << "Event Type:" << event->type() << "Receiver:" << receiver->objectName();// 调用基类的 notify 方法继续正常的事件传递return QApplication::notify(receiver, event);}
};int main(int argc, char *argv[]) {MyApplication app(argc, argv);// ... 创建窗口和其他组件 ...return app.exec();
}
在这个重写的notify
方法中,您可以看到事件类型和接收事件的对象名称。您需要记得调用基类的notify
方法以确保事件继续被正常处理。
使用 QObject 的 event 方法
如果您只想监控某个特定对象的事件,您可以重写该对象的event
方法:
#include <QObject>
#include <QDebug>
#include <QEvent>class MyObject : public QObject {
public:MyObject(QObject *parent = nullptr) : QObject(parent) {}protected:bool event(QEvent *event) override {// 打印事件类型qDebug() << "Event Type:" << event->type();// 调用基类的 event 方法继续正常的事件处理return QObject::event(event);}
};// 使用 MyObject 的实例
这种方法只会打印传递给MyObject
实例的事件。
在打印事件时,记得event->type()
返回的是QEvent::Type
枚举值,您可能需要转换这个值为人类可读的形式,可以通过创建一个映射表或者在调试时查找对应的枚举名称。
请注意,打印所有事件可能会导致大量的输出,这可能会影响应用程序的性能,因此这通常只在调试时使用。在生产环境中,您应该禁用或删除这些调试输出。
2.使用 QObject 的 event 方法
#include <QCoreApplication>
#include <QDebug>
#include <QEvent>
#include <QObject>
#include <QTimerEvent>class MyObject : public QObject {
public:MyObject(QObject *parent = nullptr) : QObject(parent) {}protected:bool event(QEvent *event) override {// 打印事件类型和对象名称qDebug() << "Event Type:" << event->type() << "Object:" << this->objectName();// 调用基类的 event 方法继续正常的事件处理return QObject::event(event);}void timerEvent(QTimerEvent *event) override {// 重写 timerEvent 来处理计时器事件qDebug() << "Timer Event:" << event->timerId();// 调用基类的 timerEvent 方法QObject::timerEvent(event);}
};int main(int argc, char *argv[]) {QCoreApplication app(argc, argv);// 创建 MyObject 实例MyObject obj;obj.setObjectName("MyObject"); // 设置对象名称以便在调试输出中识别// 开始一个计时器int timerId = obj.startTimer(1000); // 1000毫秒// 进入事件循环return app.exec();
}
3.使用 QApplication 的 notify 方法
#include <QApplication>
#include <QDebug>
#include <QEvent>
#include <QWidget>class MyApplication : public QApplication {
public:MyApplication(int &argc, char **argv): QApplication(argc, argv) {}bool notify(QObject *receiver, QEvent *event) override {// 打印事件类型和接收者的名称qDebug() << "Event Type:" << event->type()<< "Receiver:" << (receiver ? receiver->objectName() : "NULL");// 调用基类的 notify 方法以继续正常的事件分发return QApplication::notify(receiver, event);}
};int main(int argc, char *argv[]) {MyApplication app(argc, argv);QWidget window;window.setObjectName("MainWindow"); // 为了在调试输出中识别,设置窗口的对象名称window.setWindowTitle("Event Printer Example"); // 设置窗口标题window.show(); // 显示窗口return app.exec(); // 进入事件循环
}