8 Stimmen

Gibt es einen saubereren Weg, um Qt benutzerdefinierte Ereignisse zu registrieren?

Ich muss mehrere benutzerdefinierte Ereignisklassen für eine Qt-Anwendung erstellen.

Im Moment sieht es so aus, dass ich den folgenden Ereignistyp-Registrierungscode für jede Ereignisklasse implementieren muss:

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

Gibt es Vorschläge, wie ich dies vereinfachen oder zumindest mit einem Makro ausblenden kann?

8voto

Gunther Piez Punkte 28746

Dafür sind Vorlagen da. Sie können mit konstanten integralen Parametern verwendet werden, die ebenfalls zur Kompilierzeit bekannt sein müssen:

enum EventNames { UpdateEvent,... }

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

    static QEvent::Type eventType;

private:
    static QEvent::Type registeredType();
}

Der allgemeine Code sieht folgendermaßen aus:

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

Die statische Initialisierung (Vorsicht!) sieht wie folgt aus:

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

Der für jeden Ereignistyp spezifische Code kann dann als Vorlagenspezialisierung implementiert werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X