2011-06-03 9 views
6

Necesito crear varias clases de eventos personalizados para una aplicación Qt.¿Existe alguna manera más clara de registrar eventos personalizados Qt?

En este momento, parece que voy a necesitar para poner en práctica el siguiente código de registro del tipo de evento para cada clase de evento:

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

Cualquier sugerencia sobre cómo puedo simplificar esto, o al menos ocultarlo con una macro ?

+1

También puede echar un vistazo a [esta publicación de stackoverflow] (http://stackoverflow.com/a/8232397/5253471). Funciono bien para mi. – Francois

+1

@Francois Sí, la respuesta a la que se ha vinculado proporciona una solución más elegante que esto más el hecho de que en los tipos de eventos generales se definen como constantes para evitar anular un evento de la nada. – rbaleksandar

Respuesta

6

Para eso están las plantillas. Se pueden usar con parámetros constantes integrales, las cuales necesitan ser conocidas en tiempo de compilación también:

enum EventNames { UpdateEvent,... } 

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

    static QEvent::Type eventType; 

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

La código común Lokes como esto: (ten cuidado)

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

inicialización estática se ve así:

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

El código específico para cada tipo de evento se puede implementar como especialización de plantilla.

+0

¡Genial! Si creo clases de eventos adicionales, ¿eso significa que tendré que cambiar el 'enum'? –

+0

Sí. También necesitará inicializar cada plantilla estática, pero si crea más de un objeto de evento de un tipo determinado, compartirán la estática como siempre – hirschhornsalz

+3

También puede simplemente inicializar la plantilla estática con una plantilla: 'template QEvent :: Tipo MyEvent :: eventType = QEvent :: None; ', entonces no necesita actualizar la inicialización para cada tipo de evento. Este es el único lugar donde puede usar plantillas en tipos no funcionales que no son de clase. – Xeo

Cuestiones relacionadas