2010-09-16 22 views
21

Tengo un conjunto bastante complejo de clases de C++ que se vuelven a escribir desde Java. Entonces cada clase tiene una única clase heredada, y luego implementa una o más clases abstractas (o interfaces).Qt interfaces o clases abstractas y qobject_cast()

¿Es posible usar qobject_cast() para convertir de una clase a una de las interfaces? Si obtengo todas las interfaces desde QObject, aparece un error debido a las referencias ambiguas de QObject. Sin embargo, si solo tengo la clase base heredada de QObject, no puedo usar qobject_cast() porque eso funciona con QObject s.

Me gustaría ser capaz de lanzar alrededor de las clases entre los complementos y las DLL a las que se refieren sus interfaces.

+0

Como estoy leyendo más en los documentos, no estoy seguro de qué es lo que quiero hacer es posible ... y eso no es bueno. Podría usar el .dynamicCast () RTTI basado en RTTI, pero no parece que eso funcionaría siempre a través de los límites de la DLL. –

+0

Encontré esto: http://stackoverflow.com/questions/3201273/qt-moh-multiple-inheritance-problem, así que supongo que ya se ha preguntado. –

Respuesta

28

Después de algunas investigaciones y leer the qobject_cast documentation, he encontrado este:

qobject_cast() también se puede utilizar en conjunción con interfaces; vea el Enchufe & Ejemplo de pintura para más detalles.

Aquí está el enlace al ejemplo: Plug & Paint.

Después de desenterrar el interfaces header en el ejemplo, encontré la macro Q_DECLARE_INTERFACE que debería permitirle hacer lo que quiera.

Primero, no herede QObject de sus interfaces. Para cada interfaz que tiene, utilice la declaración Q_DECLARE_INTERFACE así:

class YourInterface 
{ 
public: 
    virtual void someAbstractMethod() = 0; 
}; 

Q_DECLARE_INTERFACE(YourInterface, "Timothy.YourInterface/1.0") 

Luego, en su definición de clase, utilice el Q_INTERFACES macro, de esta manera:

class YourClass: public QObject, public YourInterface, public OtherInterface 
{ 
    Q_OBJECT 
    Q_INTERFACES(YourInterface OtherInterface) 

public: 
    YourClass(); 

    //... 
}; 

Después de todo este problema, las siguientes obras de códigos :

YourClass *c = new YourClass(); 
YourInterface *i = qobject_cast<YourInterface*>(c); 
if (i != NULL) 
{ 
    // Yes, c inherits YourInterface 
} 
+0

¡Ahh! Guay. Probé el Q_DECLARE_INTERFACE, pero no agregué las Q_INTERFACES al objeto derivado. Gracias por la ayuda. –

+0

@Timothy - Estoy feliz de poder ayudar. Aprendo algo nuevo sobre Qt todos los días. :) – Venemo

+2

Normalmente, las personas usan 'if (YourInterface * i = qobject_cast (c)) {}'. Esto garantiza que el puntero nunca se use si no es válido. – Puppy

Cuestiones relacionadas