2011-06-03 34 views
6

我需要爲Qt應用程序創建幾個自定義事件類。是否有更簡潔的方式來註冊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

你也可以看看[this stackoverflow post](http://stackoverflow.com/a/8232397/5253471)。它對我很好。 – Francois 2015-12-16 18:19:17

+1

@Francois是的,你已經鏈接到的答案提供了一個比這更優雅的解決方案,再加上這樣一個事實,即通常事件類型被定義爲常量,以防止事件超越事件。 – rbaleksandar 2017-02-04 15:44:14

回答

6

這就是模板的用途。

enum EventNames { UpdateEvent,... } 

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

    static QEvent::Type eventType; 

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

通用代碼lokes這樣的:他們可以用整型常量參數,這就需要在編譯的時候也被稱爲使用(!當心)

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; 

然後,可以將每個事件類型的特定代碼實現爲模板特化。

+0

太棒了!如果我創建其他事件類,是否意味着我需要更改'enum'? – 2011-06-03 08:39:44

+0

是的。您還需要初始化每個template-static,但是如果您從給定類型創建多個事件對象,它們將像往常一樣共享靜態 – hirschhornsalz 2011-06-03 08:48:53

+3

您還可以使用模板初始化template-static:template QEvent :: Type MyEvent :: eventType = QEvent :: None;',那麼你不需要更新每個事件類型的初始化。這是唯一可以在非類非函數類型上使用模板的地方。 – Xeo 2011-06-03 09:10:58

相關問題