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(); // 进入事件循环
}