8

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

これを単純化する方法、または少なくともマクロで非表示にする方法について何か提案はありますか?

4

1 に答える 1

8

そのためのテンプレートです。これらは、コンパイル時にも知る必要がある定数整数パラメーターで使用できます。

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;

次に、各イベント タイプに固有のコードをテンプレートの特殊化として実装できます。

于 2011-06-03T08:34:51.510 に答える