是否有更简洁的方式来注册Qt自定义事件?

Ton*_*ony 7 c++ macros qt qevent

我需要为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;
}
Run Code Online (Sandbox Code Playgroud)

关于如何简化这个,或者至少用宏隐藏它的任何建议?

Gun*_*iez 8

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

enum EventNames { UpdateEvent,... }

template<EventNames E>
class MyEvent : public QEvent
{
public:
    MyEvent() : QEvent(registeredType())
    {
    }

    static QEvent::Type eventType;

private:
    static QEvent::Type registeredType();
}
Run Code Online (Sandbox Code Playgroud)

公共代码如下所示:

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

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

QEvent::Type MyEvent<UpdateEvent>::eventType = QEvent::None;
Run Code Online (Sandbox Code Playgroud)

特定于每种事件类型的代码可以实现为模板特化.

  • 您还可以使用模板初始化template-static:`template <EventNames E> QEvent :: Type MyEvent <E> :: eventType = QEvent :: None;`,然后您不需要为每个更新初始化事件类型.这是唯一可以在非类非函数类型上使用模板的地方. (3认同)