2010-07-08 16 views
10

In meiner Qt-Anwendung habe ich eine Basisklasse wie folgt. Ich verwende QObject, weil ich den Signal-Slot-Mechanismus in allen abgeleiteten Klassen verwenden möchte.Was ist die korrekte Art der Mehrfachvererbung in Qt/C++?

class IRzPlugin : public QObject { 

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

Dann habe ich eine andere Klasse wie folgt. Ich muss von QWidget erweitern, da ich Methoden zur Ereignisbehandlung in allen abgeleiteten Klassen implementieren muss (mouseMoveEvent(), keyPressEvent() .. etc);

class IRzLayeringPlugin : public IRzPlugin , public QWidget{ 

} 

Aber Compiler gibt diese die Fehler:

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 

Antwort

6

In der aktuellen Inkarnation ist es nicht möglich, QObject in mehreren Vererbungswegen für eine abgeleitete Klasse (wie Ihre IRzLayeringPlugin Klasse) zu verwenden. Die einzige Lösung, die ich jemals gesehen habe, war eine Interfaceklasse ohne QObject inheritence zu erstellen, aber mit Funktionen, die direkt den QObject Funktionen entsprechen, die Sie verwenden möchten, implementieren Sie dann die Brücke zwischen der Schnittstelle und Ihrer anderen QObject Klassenvererbung in Ihrem spezifischen Klasse. Es wird ziemlich schnell hässlich.

+0

danke, das ist was ich endlich gemacht habe / –

3

Die QObject Basisklasse in der abgeleiteten Klasse mehr als einmal enthalten zu werden. Sie müssen virtual base classes verwenden, um das Problem zu lösen.

+3

Das ist in diesem Fall nicht möglich, da 'QWidget' virtuell von' QObject' abgeleitet werden müsste. – Job

6

Es gab eine ähnliche Frage heute here.

Grundsätzlich werden zwei Dinge benötigt:

  • Q_DECLARE_INTERFACE nach der Schnittstelle Klassendeklaration Hinzufügen
  • die Schnittstelle zum Q_INTERFACES Makro der Klasse

Danach Hinzufügen wird qobject_cast arbeiten mit Ihre Schnittstellen.

Wenn Sie Signale und Slots von den Schnittstellen verwenden möchten, haben Sie Pech, denn Sie können das nur mit Typen tun, die von QObject abgeleitet sind. Aber in diesem Fall würden Sie immer den 'QObject' is an ambiguous base of 'IRzLayeringPlugin' Fehler erhalten.

In diesem Fall ist @ Calebs Idee immer noch die beste.

Verwandte Themen