有没有更清洁的方式来注册Qt自定义事件? [英] Is there a cleaner way to register Qt custom events?

查看:209
本文介绍了有没有更清洁的方式来注册Qt自定义事件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I need to create several custom event classes for a Qt application.

现在,它看起来像我需要实现以下事件类型注册码为每个事件类:

Right now, it looks like I will need to implement the following event type registration code for each event class:

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;
}

有关如何简化此操作的建议,宏?

Any suggestions on how I can simplify this, or at least hide it with a macro?

推荐答案

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

That's what templates are for. They can be used with constant integral parameters, which need to be known at compile time too:

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;
}

静态初始化(beware!)如下所示:

Static initialization (beware!) looks like this:

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

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

The code specific for each event type can be implemented as template specialization then.

这篇关于有没有更清洁的方式来注册Qt自定义事件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆