C'è un modo per trovare l'istanza QMetaObject di una classe, dato il nome della classe? quello che mi piace fare è caricare gli oggetti dal disco, ma perché ciò accada, ho bisogno di un modo per recuperare un'istanza QMetaObject usando il nome di una classe, in modo da usare QMetaObject per creare un'istanza.Come posso trovare un'istanza metaobject Qt da un nome di classe?
risposta
È possibile memorizzare le istanze metaclasse di cui avrete bisogno in un hash o mappa, per poi recuperarli via qualsiasi nome li memorizzato sotto
Per il vostro caso la soluzione appropriata può essere utilizzando meccanismo di plug-in Qt. Offre funzionalità per caricare facilmente la libreria condivisa/dinamica e verificare se contiene l'implementazione di alcune interfacce desiderate, in tal caso - creare l'istanza. Dettagli possono essere trovati qui: How to Create Qt Plugins
Si dovrebbe essere in grado di farlo con QMetaType. Potresti aver bisogno di Q_DECLARE_META_TYPE()
e/o qRegisterMetaType()
per rendere noti i tuoi tipi. Quindi dovrebbe funzionare più o meno come in questo esempio dal link:
int id = QMetaType::type("MyClass");
if (id == 0) {
void *myClassPtr = QMetaType::construct(id);
...
QMetaType::destroy(id, myClassPtr);
myClassPtr = 0;
}
mi hanno dovuto affrontare lo stesso problema da poco. Avevo bisogno del metaoggetto senza dover creare un'istanza della classe stessa. La cosa migliore che potrei fare è creare una funzione globale/statica che recuperi il qmetaobject dato il nome della classe. Ho raggiunto questo obiettivo utilizzando QObject :: staticMetaObject.
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
Se qualcuno ha una soluzione migliore, si prega di condividere!
Si può anche dare un'occhiata alla funzione: QMetaType::metaObjectForType
che
rendimenti QMetaType :: metaObject per il tipo
Aggiornamento: Questo è il mio codice, creare una classe in base al nome della classe . (Si noti che la classe deve essere registrato presso qRegisterMetaType (o è di base QObject)
int typeId = QMetaType::type("MyClassName");
const QMetaObject *metaObject = QMetaType::metaObjectForType(typeId);
QObject *o = metaObject->newInstance();
MyClassName *myObj = qobject_cast<MyClassName*>(o);
Update 2:. Ho dimenticato di dire che il costruttore di classe Yout deve essere contrassegnato come Q_INVOKABLE
- 1. Come arrivare nome di funzione in funzione Qt
- 2. QT: richiama il nome classe di un oggetto
- 3. Metaobject Protocol (MOP) in Groovy
- 4. Come posso emettere un segnale da un'altra classe?
- 5. SQLAlchemy non riesce a trovare un nome di classe
- 6. Come trovare il nome classe figlio dalla classe base?
- 7. Ottieni il nome classe da un modulo
- 8. Come cambiare nome di classe di un elemento da jQuery
- 9. Come trovare rapidamente il nome completo di una classe
- 10. Istanziare una classe Python da un nome
- 11. C'è un modo per ottenere il nome classe di una classe derivata QObject senza creare un'istanza di quella classe?
- 12. Impossibile trovare il nome classe attività predefinita
- 13. Come posso impostare dove un'app Qt trova un modulo Qt?
- 14. Python - come posso ottenere il nome di classe all'interno di un metodo di classe - utilizzando @classmethod
- 15. Come trovare un oggetto per nome in pyqt?
- 16. Come trovare il nome della classe all'interno di un mucchio di vasi
- 17. Ancora un altro "come trovare il nome della classe/costruttore di un oggetto Javascript"?
- 18. Qt QML da QML a C++ QImage su Android
- 19. Dove posso trovare un elenco di codici chiave da utilizzare con la classe NSEvent di Cocoa?
- 20. Come posso ottenere il nome di una classe Ruby?
- 21. jquery getElementsByClassName trovare il nome di classe parziale
- 22. Rimozione di estensione di un nome di file in Qt
- 23. Nome classe da jclass in JNI
- 24. Come posso richiamare un metodo di classe da NSInvocation?
- 25. Come posso trovare i riferimenti di una classe in Eclipse?
- 26. Dove posso trovare la classe Base64Encoder?
- 27. Come trovare la directory di installazione di un'applicazione Qt?
- 28. Dove posso trovare binarycreator in sdk QT per la creazione di Qt Installer
- 29. Nome del Design Pattern: ottenere classe da livello di classe
- 30. come capire quale classe anonima interna è indicata da un nome di classe?