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
- 1. Wie kann ich nur 'interessante' Wörter aus einem Korpus finden?
- 2. Wie bekomme ich "valueOf" eine enum bei einem Klassennamen?
- 3. Wie kann ich den Klassennamen dynamisch setzen?
- 4. Wie füge ich einem BoundField eine CSS-Klasse hinzu, damit ich sie mit jQuery finden kann?
- 5. Wie kann ich eine Teilsequenz in einem & [u8] Slice finden?
- 6. Wie Klassennamen aus einem CSS-Selektor extrahiert werden?
- 7. Könnte kendoNumericTextBox nach Klassennamen finden
- 8. Wie kann ich finden, welche Aktivitäten oder Dienste ich aus einem anderen Programm verwenden kann
- 9. Wie kann ich eine Tabelle aus einem HTML-Dokument entfernen?
- 10. Wie kann ich eine ICollection-Eigenschaft aus einem IRecord herausholen?
- 11. Wie kann ich ein Objekt aus einer Zeichenfolge instanziieren, die seinen Klassennamen enthält?
- 12. Finden div-Element von mehreren Klassennamen?
- 13. Dynamische Klassendefinition mit einem Klassennamen
- 14. Wie kann ich document.querySelector verwenden, um diesen Klassennamen mit einem Leerzeichen darin auszuwählen?
- 15. Wie kann ich einen String Text in einen Klassennamen umwandeln
- 16. Wie kann eine Klasse auf ihren eigenen Klassennamen zugreifen?
- 17. Wie kann ich einen Swift-Klassennamen dynamisch abändern?
- 18. Wie kann ich alle Guids in einem Text finden?
- 19. Wie erstelle ich eine org.primefaces.model.UploadedFile aus einem org.apache.commons.io.output.ByteArrayOutputStream
- 20. Wie kann ich in einem übergeordneten Dokument aus einem Iframe
- 21. Wie kann ich FAST-Funktionen aus einem Bild extrahieren?
- 22. Wie kann ich das "Application_Model_" Präfix aus Zend Framework Modell Klassennamen löschen?
- 23. Kann ich einen WPF-Seitenpfad in einen Klassennamen konvertieren
- 24. Wie kann ich alle Initialisierungen in einem Text finden?
- 25. Wie kann ich wiederholte Buchstaben mit einem Perl Regex finden?
- 26. Wie kann ich Leerzeichen in einem String finden?
- 27. Wie kann ich ungenutzte Funktionen in einem PHP-Projekt finden?
- 28. Wie kann ich die neueste Version eines Artefakts aus einem Maven-Repository finden
- 29. Wie kann ProGuard Methoden- und Klassennamen verschleiern?
- 30. Kann ich eine jquery-Funktion von einem Klick aus aufrufen?