Есть ли более чистый способ регистрации пользовательских событий Qt? - PullRequest
7 голосов
/ 03 июня 2011

Мне нужно создать несколько пользовательских классов событий для приложения 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;
}

Любые предложения о том, как я могу упростить это или, по крайней мере, скрыть это с помощью макроса?

1 Ответ

8 голосов
/ 03 июня 2011

Для этого и нужны шаблоны. Их можно использовать с постоянными интегральными параметрами, которые также должны быть известны во время компиляции:

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;

Код, специфичный для каждого типа события, может быть реализован как специализация шаблона.

...