2010-11-21 16 views
10

En mi solicitud, tengo el siguiente jerarquía de clases:¿Es posible mezclar clases de C++ derivadas de plantilla con Q_OBJECT de Qt?

class Word 
{ 
    ... 
} 

template <typename T> class Dictionary 
{ 
    ... 
}; 

class WordDictionary : public Dictionary<Word> 
{ 
    Q_OBJECT 

    ... 
} 

La clase WordDictionary analiza un diccionario que lleva mucho tiempo. Estoy ejecutando la función de análisis dentro de un hilo separado y quiero que sea capaz de señalar el hilo de la GUI de vez en cuando para proporcionar actualizaciones de progreso basadas en el número de línea actual que se está analizando. Es por eso que quiero que sea un Q_OBJECT. Traté de hacer que el diccionario de la clase base fuera Q_OBJECT pero recibí un mensaje de que las plantillas Q_OBJECT no son compatibles. Cuando quité la macro, dejando sólo WordDictionary como Q_OBJECT, consigo un montón de mensajes de error de la forma general:

\ GeneratedFiles \ Release \ moc_dictionary.cpp (44):. Error C2039: 'staticMetaObject': no es un miembro de 'diccionario'
con
[
T = Palabra
]

¿hay algo que pueda hacer para que mi plantilla derivada de la clase WordDictionary un Q_OBJECT aparte de codificar las funciones de plantilla en de lado, produciendo un montón de código repetitivo?

edición: Cambio de la declaración de plantilla a:

template <typename T> class Dictionary : public QObject 

hizo la compilación de código. No estoy seguro si no estoy haciendo algo estúpido y si esto funcionará correctamente, sin embargo.

+0

[¿Por qué Qt no utiliza plantillas para las señales y las ranuras] (http://qt-project.org/doc/qt-4.8/templates.html) –

Respuesta

14

No puede hacer esto directamente, pero hay rondas de trabajo utilizables. Ver el artículo here.

Si bien es teóricamente posible que moc manejar plantillas, sería extremadamente compleja de implementar, y sería muy poco práctico de usar: Para cada uno de instancias de plantilla, moc tendría que generar la adecuada código de meta-objeto, y el código generado tendrían que ser incluidos una vez por unidad de enlace --- que se convierte en una pesadilla de mantener una vez una plantilla clase se utiliza con el mismo parámetro de plantilla en diferentes compilación unidades.

Si las señales y ranuras no requieren el parámetro de plantilla para formar parte de el prototipo, la solución consiste en crea una clase de plantilla heredan una subclase QObject que proporciona las señales y franjas horarias necesarias. Si las señales y ranuras necesitan usar los parámetros de plantilla , el patrón Observer es una alternativa.

2

yo sólo probamos este código y se compila y ejecuta bien:

#include <QtCore/QCoreApplication> 
#include <QObject> 

class Word 
{ 

}; 

template <typename T> class Dictionary 
{ 

}; 

class WordDictionary : public Dictionary<Word>, QObject 
{ 
    Q_OBJECT 
}; 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 
    WordDictionary wd(); 
    return a.exec(); 
} 

Puede ser que me falta algo?

+0

Esto puede crear problemas en la línea, echa un vistazo al artículo Cité para una discusión. –

+0

@Steve: ¿Qué problemas más adelante? El artículo citado solo trata de obtener una plantilla de clase de un QObject. Esto está derivando una clase de una instancia de plantilla y un QObject. El único problema que veo con esto es que QObject debe ser el primero en la lista de herencia, ya que moc supone que la primera clase heredada es una subclase de QObject. – baysmith

+3

¿No debería QObject ser la primera clase base? – zarzych

Cuestiones relacionadas