2011-06-03 6 views
6

मुझे एक क्यूटी आवेदन के लिए कई कस्टम इवेंट क्लास बनाने की जरूरत है।क्या क्यूटी कस्टम घटनाओं को पंजीकृत करने का कोई क्लीनर तरीका है?

अभी, यह है कि मैं प्रत्येक घटना के वर्ग के लिए निम्न इवेंट प्रकार पंजीकरण कोड को लागू करने की आवश्यकता होगी दिखता है:

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

आप [इस स्टैक ओवरफ्लो पोस्ट] (http://stackoverflow.com/a/8232397/5253471) पर भी एक नज़र डाल सकते हैं। यह मेरे लिए अच्छा काम किया। – Francois

+1

@ फ्रैंकोइस हां, आपके द्वारा लिंक किया गया उत्तर इस प्लस के मुकाबले एक और अधिक सुरुचिपूर्ण समाधान प्रदान करता है कि सामान्य घटना प्रकारों को किसी भी घटना को ओवरराइड करने से रोकने के लिए स्थिरांक के रूप में परिभाषित किया जाता है। – rbaleksandar

उत्तर

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' को बदलने की आवश्यकता होगी? –

+0

हां। आपको प्रत्येक टेम्पलेट-स्टेटिक को प्रारंभ करने की भी आवश्यकता होगी, लेकिन यदि आप किसी दिए गए प्रकार से एक से अधिक ईवेंट ऑब्जेक्ट बनाते हैं, तो वे स्थिर को सामान्य – hirschhornsalz

+3

के रूप में साझा करेंगे, आप टेम्पलेट के साथ टेम्पलेट-स्टेटिक को भी प्रारंभ कर सकते हैं: 'template QEvent :: MyEvent टाइप करें :: eventType = QEvent :: कोई नहीं; ', तो आपको प्रत्येक ईवेंट प्रकार के लिए प्रारंभिकरण को अपडेट करने की आवश्यकता नहीं है। यह एकमात्र ऐसा स्थान है जहां आप गैर-वर्ग गैर-फ़ंक्शन प्रकारों पर टेम्पलेट का उपयोग कर सकते हैं। – Xeo

संबंधित मुद्दे

 संबंधित मुद्दे