2009-09-28 15 views
6

Ich sah mir die verwandten Fragen an und konnte nichts finden, was genau das anspricht, worüber ich gesprochen habe, also lass mich das beschreiben.In Qt, wie verwende ich Q_OBJECT Slots und Signale mit Mehrfachvererbung?

Ich habe eine Klasse, sagen wir Foo, die ihre eigenen Slots und Signale haben muss, aber auch von QXmlDefaultHandler erben muss (klingt ziemlich seltsam, aber ich habe diese Situation beim Versuch, QHttp zu verwenden, um eine Website direkt zu lesen ein QBuffer).

Dieser Code wird, wenn er von einem cpp begleitet wird, um bar mit einem Signal woanders zu verbinden, nicht kompiliert. Sie erhalten Fehler über einige Mitglieder von QObject, die kein Mitglied von QXmlDefaultHandler sind. Außerdem können Sie Q_OBJECT nicht verschieben oder Sie erhalten Vtable-Fehler, wenn Sie einige Dinge nicht implementieren (weitermachen! Versuchen Sie es!).

siehe meine Antwort für die (sehr einfache) Lösung. Ich werde Sie als akzeptierte Antwort wählen, wenn ich denke, Sie erklären es besser als ich.

bearbeiten: für Sie C++ und Qt Tierärzte, bitte posten Sie eine Antwort, wenn Sie es besser erklären können. Ich habe ziemlich viel Zeit damit verbracht, diese Informationen zu lesen, also bitte hilf jemand anderem, wenn du es besser kannst als ich.

Antwort

12

The documentation for moc heißt es, dass in Fällen von Mehrfachvererbung, die Klasse QObject Bereitstellen erste

erscheinen sollte Wenn Sie Mehrfachvererbung verwenden, geht davon aus moc, dass die ersten -Klasse ist eine Unterklasse von QObject geerbt. Auch sicher sein, dass nur die erste geerbte Klasse ein QObject ist.

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

Virtuelle Vererbung mit QObject ist nicht unterstützt.

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

So einfach es klingt, wenn Sie QObject nicht zuerst in die Vererbungsliste aufnehmen, ist diese Aufgabe nicht möglich. Es ist eine Einschränkung in Qt's Meta-Objektsystem. Wenn Sie das nicht tun, wird der Compiler versuchen, einige Mitglieder von QObject als Teil von QXmlDefaultHandler anzuwenden.

Verwandte Themen