Ich habe eine Interface-Klasse in einer Header-Datei wie folgt.Umwandlung von Interface zu QObject
class Interface
{
...
}
#define InterfaceIID "Interface"
Q_DECLARE_INTERFACE(Interface, InterfaceIID)
, die wie dieser
class Implementation : public QWidget, public Interface
{
Q_OBJECT
Q_INTERFACES(Interface)
...
}
ich Zeiger auf Objekte haben meine Schnittstelle in meiner Anwendung übergeben um wird die Umsetzung durchgeführt wird zu erwarten. Jetzt weiß ich, dass jedes Interface-Objekt auch ein QWidget ist, da dies der einzige unterstützte Anwendungsfall ist.
Meine Frage ist jetzt, wenn ich ein QWidget-Objekt benötige, wie gieße ich mein Interface-Objekt an ein QWidget?
qobject_cast<QWidget*>(interface) //does not compile
dynamic_cast<QWidget*>(interface) //works but is it the right way?
Verwenden Sie dynamic_cast() die einzige Möglichkeit? Ich kann mit qobject_cast() von QWidget auf Interface umwandeln, aber das Gegenteil funktioniert nicht.
Ich verstehe, dass dynamic_cast() über gemeinsame Bibliotheken unsicher ist und daher versuche ich es zu vermeiden.
Was ist der richtige Ansatz?
Zuerst die "Schnittstelle" zu "Impelentation" umsetzen und dann "Implementierung" in "QWidget" umwandeln. Ich bezweifle, dass "Interface" in ein "QWidget" umgewandelt werden kann, da sie nicht Teil derselben Vererbungskette sind. – rozina
@rozina QWidget könnte möglicherweise eine Basisimplementierung von Interface sein (keine Möglichkeit, aus dem angegebenen Code zu unterscheiden), so dass ein Cast von Interface * nach QWidget * funktionieren könnte. dynamic_cast gibt die Antwort sicher. – Neil
@rozina Leider kann ich das nicht tun.Wo diese Besetzung stattfindet, kennt der Code die Implementierung nicht. Es kennt nur die Schnittstelle und nimmt an, dass die Implementierung auch von QWidget übernommen worden wäre, wie dokumentiert. –