Qt Mehrfachvererbung und Signale
Ich habe ein problem mit QT zu mehreren enheritance, weil von QObject. Ich weiß, dass viele andere die gleichen Probleme haben, aber ich weiß nicht wie ich es beheben sollte.
class NavigatableItem : public QObject
{
Q_OBJECT
signals:
void deselected();
void selected();
void activated();
};
class Button : public NavigatableItem, public QToolButton
{
Q_OBJECT
...
}
class MainMenuOption : public Button
{
Q_OBJECT
...
}
Wenn ich dies tun
MainMenuOption* messages = new MainMenuOption();
connect(messages, SIGNAL(selected()), SLOT(onMenuOptionSelected()))
Bekomme ich die Fehlermeldung:
QObject' ist ein Mehrdeutiger Basis von 'MainMenuOption'
Der Grund, warum ich lassen Sie NavigatableItem enherit von QObject, weil die Signale. Gibt es eine Möglichkeit, dies zu tun?
Edit:
Hinzufügen von virtuellen zu jeder inheritence Erklärung, gibt mir immer noch den gleichen Fehler:
class NavigatableItem : public virtual QObject
class Button : public virtual NavigatableItem, public virtual QToolButton
class MainMenuOption : public virtual Button
Sogar nach einer 'sauber', 'run qmake' und 'bauen'.
- Sie können nicht Erben aus mehreren QObject Unterklassen. Nur einer von Ihnen kann ein QObject ist, und es muss die erste in der Liste.
- Versuchen Sie das löschen dieser
moc_*
,*.obj
Dateien und haben Alles neu erstellen.. - Siehe aktualisierte Frage. Wiederaufbau trifft nicht zu beheben.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es erfordert ein bisschen mehr code, aber was ich in der Vergangenheit getan haben, ist einer von Ihnen (Ihr
NavigatableItem
in diesem Fall) eine rein virtuelle Klasse, also interface. Anstatt die "Signale" makro machen, diese rein virtuelle geschützte Funktionen. Dann multiplizieren Sie Erben von Ihrem QObject abgeleitete Klasse als auch das interface und die Implementierung der Methoden.Ich weiß, es ist etwas kontrovers, aber vermeiden Sie mehrfache implementierungsvererbung, bei der alle Kosten übernimmt lösen eine Vielzahl von Problemen und Verwirrung. Die Google C++ Style Richtlinien empfehlen dieses, und ich denke, es ist ein guter Rat.
Nutzung von virtuellen inheritence, z.B.
wird nur eine Kopie von der Basisklasse Y
virtual
in der Erklärung vonclass A
. NurY
hat, vererbt zu werden praktisch und das ist genau das, was PoweRoy nicht zu tun.Sollten Sie verwenden virtuelle Vererbung.
sehen http://en.allexperts.com/q/C-1040/virtual-inheritance.htm
Scheint, wie Sie mit dem diamond-Problem, siehe auch:
http://www.cprogramming.com/tutorial/virtual_inheritance.html
Machen Sie es wie diese: