Gibt es eine Möglichkeit, die QMetaObject-Instanz einer Klasse unter dem Klassennamen zu finden? Was ich gerne mache, ist das Laden von Objekten von der Festplatte, aber damit dies passiert, muss ich eine QMetaObject-Instanz mit dem Namen einer Klasse abrufen, um mit QMetaObject eine Instanz zu erstellen.Wie kann ich eine Qt-Metaobjekt-Instanz aus einem Klassennamen finden?
Antwort
können Sie speichern die MetaClass Instanzen, die Sie in einem Hash oder Karte benötigen, und rufen sie dann über einen beliebigen Namen sie gespeichert unter
Für Ihren Fall die passende Lösung kann unter Verwendung von Qt Plugin-Mechanismus werden. Es bietet Funktionen zum einfachen Laden der freigegebenen/dynamischen Bibliothek und prüft, ob es die Implementierung einer gewünschten Schnittstelle enthält. Wenn ja, erstellen Sie die Instanz. Details finden Sie hier: How to Create Qt Plugins
Sie sollten in der Lage sein, dies mit QMetaType zu tun. Sie benötigen möglicherweise Q_DECLARE_META_TYPE()
und/oder qRegisterMetaType()
, um Ihre Typen bekannt zu machen. Dann sollte es ungefähr wie in diesem Beispiel von der Verbindung funktionieren:
Ich habe in letzter Zeit das gleiche Problem konfrontiert. Ich brauchte das Metaobjekt, ohne eine Instanz der Klasse selbst erstellen zu müssen. Am besten kann ich eine globale/statische Funktion erstellen, die das qmetaObject anhand des Klassennamens abruft. Das habe ich mit QObject :: staticMetaObject erreicht.
QMetaObject GetMetaObjectByClassName(QString strClassName)
{
QMetaObject metaObj;
if (strClassName.compare("MyClass1") == 0)
{
metaObj = MyClass1::staticMetaObject;
}
else if (strClassName.compare("MyClass2") == 0)
{
metaObj = MyClass2::staticMetaObject;
}
else if (strClassName.compare("MyClass3") == 0)
{
metaObj = MyClass3::staticMetaObject;
}
else if (strClassName.compare("MyClass4") == 0)
{
metaObj = MyClass4::staticMetaObject;
}
else if (strClassName.compare("MyClass5") == 0)
{
metaObj = MyClass5::staticMetaObject;
}
// and so on, you get the idea ...
return metaObj;
}
See: http://doc.qt.io/qt-5/qobject.html#staticMetaObject-var
Wenn jemand eine bessere Möglichkeit hat, bitte teilen!
können Sie auch einen Blick auf die Funktion: QMetaType::metaObjectForType
dem
kehrt QMetaType :: metaObject für Typ
aktualisieren: Das ist mein Code, eine Klasse von Klassennamen erstellen . (Beachten Sie, dass die Klasse muss mit qRegisterMetaType registriert sein (oder ist QObject Basis)
int typeId = QMetaType::type("MyClassName");
const QMetaObject *metaObject = QMetaType::metaObjectForType(typeId);
QObject *o = metaObject->newInstance();
MyClassName *myObj = qobject_cast<MyClassName*>(o);
Update 2:. ich vergessen habe zu sagen, Yout Klasse Konstruktor markiert werden müssen Q_INVOKABLE