2009-09-28 16 views
6

Analicé las preguntas relacionadas y no pude encontrar nada que tratara exactamente de lo que estaba hablando, así que déjenme describirlo.En Qt, ¿cómo utilizo las ranuras Q_OBJECT y señales con herencia múltiple?

Tengo una clase, digamos foo que necesita tener sus propios slots y señales, pero también necesita heredar de QXmlDefaultHandler (suena bastante extraño, pero me encontré con esta situación al intentar utilizar QHttp para leer un sitio web directamente en un QBuffer).

class foo: public QXmlDefaultHandler, public QObject 
{ 
    public: 
     foo(); 
     ~foo(); 

     Q_OBJECT 
    public slots: 
     void bar(); 
} 

Este código, si va acompañado de un cpp para conectar la barra a una señal en otro lugar, no se compilará. Obtendrá errores sobre algunos miembros de QObject que no son miembros de QXmlDefaultHandler. Además, no puede mover Q_OBJECT o si no obtiene errores vtable por no implementar algunas cosas (¡vaya, pruébelo!).

por favor, consulte mi respuesta para la (muy simple) solución. Consideraré votarte como la respuesta aceptada si creo que lo explicas mejor que yo.

editar: para usted C++ y veteranos de Qt, por favor publique una respuesta si puede explicarlo mejor. Pasé bastante tiempo buscando esta información, así que por favor ayuda a alguien más si puedes hacerlo mejor que yo.

Respuesta

12

El documentation for moc establece que en los casos de herencia múltiple, la clase que proporciona QObject debe aparecer en primer lugar

Si está utilizando herencia múltiple, moc asume que el primer heredaron clase es una subclase de QObject. Además, asegúrese de que solo la primera clase heredada es un objeto QObject.

// correct 
class SomeClass : public QObject, public OtherClass 
{ 
    ... 
}; 

herencia virtual con QObject es no es compatible.

2
class foo: public QObject, public QXmlDefaultHandler 
{ 
    public: 
     foo(); 
     ~foo(); 
    Q_OBJECT 
    public slots: 
     void bar(); 
} 

Tan simple como suena, si no coloca QObject primero en la lista de herencia, esta tarea es imposible. Es una limitación en el sistema de objetos meta de Qt. Si no lo hace, el compilador intentará aplicar algunos miembros de QObject como parte de QXmlDefaultHandler.

Cuestiones relacionadas