有没有一种更干净的方式来注册Qt自定义事件

Is there a cleaner way to register Qt custom events?

本文关键字:方式 注册 Qt 事件 自定义 一种 有没有      更新时间:2023-10-16

我需要为Qt应用程序创建几个自定义事件类。

现在,我似乎需要为每个事件类实现以下事件类型注册代码:

class MyEvent : public QEvent
{
public:
    MyEvent() : QEvent(registeredType())
    {
    }
    static QEvent::Type eventType;
private:
    static QEvent::Type registeredType();
}
QEvent::Type MyEvent::eventType = QEvent::None;
QEvent::Type MyEvent::registeredType()
{
    if (eventType == QEvent::None)
    {
        int generatedType = QEvent::registerEventType();
        eventType = static_cast<QEvent::Type>(generatedType);
    }
    return eventType;
}

关于如何简化它,或者至少用宏隐藏它,有什么建议吗?

这就是模板的作用。它们可以与常数积分参数一起使用,这些参数也需要在编译时知道:

enum EventNames { UpdateEvent,... }
template<EventNames E>
class MyEvent : public QEvent
{
public:
    MyEvent() : QEvent(registeredType())
    {
    }
    static QEvent::Type eventType;
private:
    static QEvent::Type registeredType();
}

常见的代码是这样的:

template<EventNames E>
QEvent::Type MyEvent<E>::registeredType()
{
    if (eventType == QEvent::None)
    {
        int generatedType = QEvent::registerEventType();
        eventType = static_cast<QEvent::Type>(generatedType);
    }
    return eventType;
}

静态初始化(小心!)看起来像这样:

QEvent::Type MyEvent<UpdateEvent>::eventType = QEvent::None;

每个事件类型的特定代码可以实现为模板专用化。