2010-09-16 15 views
21

Ich habe eine ziemlich komplexe Reihe von C++ - Klassen, die aus Java neu geschrieben werden. Jede Klasse hat also eine einzige geerbte Klasse und implementiert dann auch eine oder mehrere abstrakte Klassen (oder Interfaces).Qt-Schnittstellen oder abstrakte Klassen und qobject_cast()

Ist es möglich, qobject_cast() zu verwenden, um von einer Klasse zu einer der Schnittstellen zu konvertieren? Wenn ich alle Schnittstellen von QObject ableite, erhalte ich einen Fehler wegen mehrdeutiger QObject Referenzen. Wenn ich jedoch nur die Basisklasse von QObject geerbt habe, kann ich qobject_cast() nicht verwenden, weil das mit QObject s funktioniert.

Ich würde gerne in der Lage sein, Klassen zwischen Plugins und DLLs zu werfen, auf die sich ihre Schnittstellen beziehen.

+0

Da ich mehr in die Dokumente lese, bin ich nicht sicher, was ich tun möchte, ist möglich ... und das ist nicht gut. Ich könnte die RTTI basierte .dynamicCast () verwenden, aber es klingt nicht so, das würde immer über DLL-Grenzen funktionieren. –

+0

Ich habe das gefunden: http://StackOverflow.com/Questions/3201273/qt-moh-multiple-inheritance-problem, also ich denke, es wurde bereits gefragt. –

Antwort

28

Nach einigen Recherchen und Lesen the qobject_cast documentation, fand ich diese:

qobject_cast() kann auch in Verbindung mit Schnittstellen verwendet werden; Beispiele finden Sie unter Plug & Paint Beispiel.

Hier ist der Link zum Beispiel: Plug & Paint.

Nach dem Graben der interfaces header in dem Beispiel, fand ich die Q_DECLARE_INTERFACE Makro, die Sie tun lassen sollten, was Sie wollen.

Zuerst nicht erben QObject von Ihren Schnittstellen. Für jede Schnittstelle, die Sie haben, verwenden Sie die Q_DECLARE_INTERFACE Erklärung wie folgt aus:

class YourInterface 
{ 
public: 
    virtual void someAbstractMethod() = 0; 
}; 

Q_DECLARE_INTERFACE(YourInterface, "Timothy.YourInterface/1.0") 

Dann in Ihrer Klassendefinition, verwenden Sie die Q_INTERFACES Makro, wie folgt aus:

class YourClass: public QObject, public YourInterface, public OtherInterface 
{ 
    Q_OBJECT 
    Q_INTERFACES(YourInterface OtherInterface) 

public: 
    YourClass(); 

    //... 
}; 

Nach all dieser Probleme, den folgenden Code funktioniert :

YourClass *c = new YourClass(); 
YourInterface *i = qobject_cast<YourInterface*>(c); 
if (i != NULL) 
{ 
    // Yes, c inherits YourInterface 
} 
+0

Ahh! Cool. Ich hatte das Q_DECLARE_INTERFACE versucht, aber das Q_INTERFACES dem abgeleiteten Objekt nicht hinzugefügt. Danke für die Hilfe. –

+0

@Timothy - Ich bin froh, dass ich helfen konnte. Ich lerne jeden Tag etwas Neues über Qt. :) – Venemo

+2

Normalerweise verwenden die Leute 'if (YourInterface * i = qobject_cast (c)) {}'. Dies stellt sicher, dass der Zeiger nie verwendet wird, wenn er ungültig ist. – Puppy

Verwandte Themen