2010-07-08 7 views
10

En mi aplicación Qt, tengo una clase base de la siguiente manera. Estoy usando QObject porque quiero usar el mecanismo Signal-Slot en todas las clases derivadas.¿Cuál es la forma correcta de herencia múltiple en Qt/C++?

class IRzPlugin : public QObject { 

public: 
    virtual void registerMenu(QWidget*); 
    virtual void execute(); 
} 

Luego tengo otra clase de la siguiente manera. Necesito extender desde QWidget porque necesito implementar métodos de manejo de eventos en todas las clases derivadas. (MouseMoveEvent(), keyPressEvent() .. etc);

class IRzLayeringPlugin : public IRzPlugin , public QWidget{ 

} 

Pero compilador da a estos los errores:

C:\svn\osaka3d\tags\iter08\prototype\osaka3d\rinzo\plugin\moc_IRzLayeringPlugin.cxx: In member function `virtual const QMetaObject* IRzLayeringPlugin::metaObject() const': 
C:\svn\osaka3d\tags\iter08\prototype\osaka3d\rinzo\plugin\moc_IRzLayeringPlugin.cxx:51: error: `QObject' is an ambiguous base of `IRzLayeringPlugin' 
C:\svn\osaka3d\tags\iter08\prototype\osaka3d\rinzo\plugin\moc_IRzLayeringPlugin.cxx:51: error: `QObject' is an ambiguous base of `IRzLayeringPlugin' 
make[2]: *** [CMakeFiles/Rinzo.dir/plugin/moc_IRzLayeringPlugin.cxx.obj] Error 1 

Respuesta

6

En la versión actual, no es posible usar QObject en varias rutas de herencia para una clase derivada (como su clase IRzLayeringPlugin). La única solución que he visto fue crear una clase de interfaz sin ninguna herencia QObject, pero con funciones que corresponden directamente a las funciones QObject que desea usar, luego implementar el puente entre la interfaz y su otra herencia de clase QObject en su especificación clase. Se pone feo bastante rápido.

+0

gracias, eso es lo que hice finalmente / –

3

La clase base QObject está consiguiendo incluyen más de una vez en la clase derivada. Necesitará usar virtual base classes para resolver el problema.

+3

Eso no es posible en este caso ya que 'QWidget' necesitaría derivar virtualmente de' QObject'. – Job

6

Hubo una pregunta similar hoy here.

Básicamente, se necesitan dos cosas:

  • Adición Q_DECLARE_INTERFACE después de la declaración de la clase de interfaz
  • Adición de la interfaz con el Q_INTERFACES macro de la clase

Después de esto, qobject_cast trabajará con tus interfaces

Si desea usar señales y ranuras desde las interfaces, no tiene suerte, porque solo puede hacerlo con tipos que se derivan de QObject. Pero en este caso, siempre obtendría el error 'QObject' is an ambiguous base of 'IRzLayeringPlugin'.

En este caso, la idea de @ Caleb sigue siendo la mejor.

Cuestiones relacionadas