Existe-t-il un moyen de trouver l'instance QMetaObject d'une classe, étant donné le nom de la classe? ce que j'aime faire est de charger des objets à partir du disque, mais pour cela, j'ai besoin d'un moyen de récupérer une instance de QMetaObject en utilisant le nom d'une classe, afin d'utiliser QMetaObject pour créer une instance.Comment puis-je trouver une occurrence de métaobjet Qt à partir d'un nom de classe?
Répondre
Vous pouvez stocker les instances métaclasse dont vous aurez besoin dans un Hash ou une carte, puis les récupérer par quelque nom que vous les stocké sous
Pour votre cas, la solution appropriée peut être en utilisant le mécanisme de plug-in Qt. Il offre des fonctionnalités pour charger facilement la bibliothèque partagée/dynamique et vérifier si elle contient l'implémentation de l'interface souhaitée, si c'est le cas, créez l'instance. Détails peuvent être trouvés ici: How to Create Qt Plugins
Vous devriez être en mesure de le faire avec QMetaType. Vous pourriez avoir besoin de Q_DECLARE_META_TYPE()
et/ou qRegisterMetaType()
pour faire connaître vos types. Ensuite, il devrait fonctionner à peu près comme dans cet exemple à partir du lien:
int id = QMetaType::type("MyClass");
if (id == 0) {
void *myClassPtr = QMetaType::construct(id);
...
QMetaType::destroy(id, myClassPtr);
myClassPtr = 0;
}
J'ai été confronté au même problème récemment. J'avais besoin du métaobjet sans avoir à créer une instance de la classe elle-même. Le mieux que je puisse faire est de créer une fonction globale/statique qui récupère le qmetaobject étant donné le nom de la classe. J'ai réalisé cela en utilisant 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;
}
Voir: http://doc.qt.io/qt-5/qobject.html#staticMetaObject-var
Si quelqu'un a une meilleure option, s'il vous plaît partager!
Vous pouvez également jeter un oeil à la fonction: QMetaType::metaObjectForType
qui
retours QMetaType :: metaObject pour le type
Mise à jour: C'est mon code, il crée une classe par nom de classe . (Notez que la classe doit être enregistrée auprès qRegisterMetaType (ou est la base QObject)
int typeId = QMetaType::type("MyClassName");
const QMetaObject *metaObject = QMetaType::metaObjectForType(typeId);
QObject *o = metaObject->newInstance();
MyClassName *myObj = qobject_cast<MyClassName*>(o);
Mise à jour 2:. j'oublié de dire le constructeur de la classe Yout doit être marqué comme Q_INVOKABLE
- 1. trouver le nom de classe
- 2. C#/.NET Comment trouver l'espace de noms contenant à partir d'un nom de classe
- 3. Occurrence de classe de levage dans Haskell
- 4. Comment sauter à une occurrence à partir de la liste de recherche Vim
- 5. Comment trouver l'avant-dernière occurrence d'un caractère dans une chaîne?
- 6. Nom de la classe à partir de son objet
- 7. Trouver des sites Web à partir du nom de l'entreprise
- 8. Instancier une classe Python à partir d'un nom
- 9. Obtenir le nom de la classe à partir d'une instance
- 10. Comment mapper une classe d'entité de groupe à partir d'une colonne "nom de groupe" dans NHibernate?
- 11. Comment repeindre une autre classe Qt
- 12. Résoudre le nom de classe à partir du bytecode
- 13. Comment trouver un élément par nom de classe dans une autre cellule d'une ligne de table?
- 14. Trouver la Nième occurrence d'un caractère dans une chaîne
- 15. Comment puis-je trouver l'ID de processus à partir du nom de service/handle dans Delphi?
- 16. Comment obtenir une référence à une instance d'une classe dérivée à partir d'une classe de base
- 17. C# Obtenir le nom du type dérivé à partir de la classe de base interne Classe
- 18. Comment dériver une classe à partir de CFindReplaceDialog? (MFC)
- 19. Trouver le nom de classe d'un contrôle d'interface utilisateur
- 20. Impossible de trouver la classe groovy à partir d'une classe Java
- 21. Instancier une classe à partir d'un objet de classe
- 22. Haxe - crée une instance d'une classe à partir d'un nom de chaîne
- 23. Comment trouver si un objet appartient à une classe mais pas à une super-classe?
- 24. Récupère le nom d'une classe à partir d'un module
- 25. Comment trouver une fonction par nom de fonction
- 26. QT: Impossible de trouver le fichier moc
- 27. Comment appeler une méthode statique d'une classe en utilisant le nom de la méthode et le nom de la classe
- 28. Extraire le nom de domaine à partir d'un nom d'hôte
- 29. Comment trouver une ressource dans un UserControl à partir d'une classe DataTemplateSelector dans WPF?
- 30. Modification de la résolution de l'écran à partir de Qt?