事件处理流程中的角色
event函数
event函数是QObject中事件处理的总入口。当有任何事件传递到一个QObject或者它的派生类对象时,这个函数首先被调用。它就像是一个事件调度中心,负责接收各种各样的事件,并根据事件的类型把它们分发给对应的具体处理函数。
例如,对于鼠标按下事件(QEvent::MouseButtonPress)、键盘按键事件(QEvent::KeyPress)等常见事件,event函数会检查事件类型,然后调用相应的特定事件处理函数,如mousePressEvent、keyPressEvent等。
customEvent函数
customEvent函数主要用于处理自定义事件。当开发者定义了自己的事件类型(通过继承QEvent类),并使用QCoreApplication::postEvent或QCoreApplication::sendEvent来发送这些自定义事件时,customEvent函数就会发挥作用。它是一个专门为处理自定义事件而预留的函数。
事件类型的关联
event函数
处理所有类型的QEvent及其派生类事件。它可以识别多种预定义的标准事件类型,如定时器事件(QEvent::Timer)、窗口激活事件(QEvent::WindowActivate)等众多事件类型。通过对event->type()返回值的判断,可以将事件分发给对应的处理逻辑。
customEvent函数
通常关联自定义事件类型。自定义事件类型的值一般是大于QEvent::User的整数(QEvent::User是一个用于自定义事件的起始标记)。当event函数判断出传入的事件类型是自定义事件类型时,会将事件传递给customEvent函数进行处理。
使用场景
event函数
适用于对标准事件的集中处理和分发。如果需要在对象级别对所有传入的事件进行统一的前置处理,或者修改事件的处理流程(比如拦截某些事件或者修改事件参数后再分发),就可以在event函数中实现。例如,在一个窗口类中,可以在event函数中记录所有事件的发生时间,用于性能分析或者事件日志记录。
customEvent函数
用于处理应用程序特定的自定义事件逻辑。比如在一个复杂的多线程图形应用程序中,自定义一个事件用于通知某个图形对象需要从后台线程更新其数据。通过自定义事件和customEvent函数,可以在不干扰标准事件处理流程的情况下,实现特定的、应用程序独有的交互逻辑。
示例代码对比
event函数示例
bool MyWidget::event(QEvent *event)
{
if (event->type() == QEvent::MouseButtonPress)
{
QMouseEvent mouseEvent = static_cast<QMouseEvent>(event);
if (mouseEvent->button() == Qt::LeftButton)
{
qDebug() << "Left mouse button pressed";
return true;
}
}
return QWidget::event(event);
}
这个event函数在MyWidget类中重写,用于处理鼠标按下事件。当检测到鼠标左键按下时,输出一条调试信息,并返回true表示事件已经被处理;否则,将事件传递给基类QWidget的event函数继续处理。
customEvent函数示例
cpp
复制
class MyCustomEvent : public QEvent
{
public:
MyCustomEvent(int data) : QEvent(static_castQEvent::Type(QEvent::User + 1)), m_data(data) {}
int getData() const { return m_data; }
private:
int m_data;
};
void MyWidget::customEvent(QEvent *event)
{
if (event->type() == QEvent::User + 1)
{
MyCustomEvent customEvent = static_cast<MyCustomEvent>(event);
qDebug() << "Custom event data: " << customEvent->getData();
}
}
首先定义了一个自定义事件类MyCustomEvent,它继承自QEvent,并带有一个自定义的数据成员。在MyWidget类的customEvent函数中,当接收到自定义事件类型(QEvent::User + 1)的事件时,将事件转换为MyCustomEvent类型,然后获取并输出其中的数据。