c++ - 有没有更简洁的方法来注册 Qt 自定义事件?

标签 c++ qt macros 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;
}

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

最佳答案

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

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;

然后可以将特定于每个事件类型的代码实现为模板特化。

关于c++ - 有没有更简洁的方法来注册 Qt 自定义事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6224598/

相关文章:

c++ - 删除 vector 中的第零个元素需要更多时间

c++ - 为什么我不能在 mac 上使用 g++ 运行这个简单的 c++ 代码?

c++ - QVector 不追加!

c++ - Qt (QFtp) 问题

c++ - 在 C++98、C++11 交叉编译代码中处理重写的优雅方法?

c++ - 如何确定内存中的 COM 对象大小?

c++ - 将文件中的值存储到数组中并根据特定数字提取值

c - 如何编写可以将调用者的名称附加到 C 中的日志输出的日志记录函数或宏

c++ - 从另一个(非 qt)线程调用 QObject 方法的线程安全性?

c++ - 语法 "ContextRegistrar_##ContextType"的含义