8
votes

Comment trouver une instance Qt MetaObject d'un nom de classe?

Y a-t-il un moyen de trouver l'instance QMetaObject d'une classe, étant donné le nom de la classe? Ce que j'aime faire, c'est de charger des objets du disque, mais pour que cela se produise, j'ai besoin d'un moyen de récupérer une instance QMetaObject à l'aide du nom d'une classe, afin d'utiliser qmetaObject pour créer une instance.


0 commentaires

5 Réponses :


0
votes

Vous pouvez stocker les instances de métaclass dont vous aurez besoin dans un hachage ou une carte, puis les récupérer via n'importe quel nom que vous avez enregistré sous


0 commentaires

0
votes

Pour votre cas, la solution appropriée peut utiliser le mécanisme de plug-in QT. Il offre une fonctionnalité pour charger facilement la bibliothèque partagée / dynamique et vérifier s'il contient la mise en oeuvre de certaines interfaces souhaitées, le cas échéant, créez l'instance. Les détails peuvent être trouvés ici: Comment créer des plugins QT


0 commentaires

4
votes

Vous devriez pouvoir faire cela avec qmetatype . Vous aurez peut-être besoin de q_declare_méta_type () code> et / ou qregistermetype () code> pour faire connaître vos types. Ensuite, cela devrait fonctionner à peu près dans cet exemple de la liaison:

 int id = QMetaType::type("MyClass");
 if (id == 0) {
     void *myClassPtr = QMetaType::construct(id);
     ...
     QMetaType::destroy(id, myClassPtr);
     myClassPtr = 0;
 }


0 commentaires

2
votes

Je suis confronté au même problème récemment. J'avais besoin de MetaObject 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 donné le nom de la classe. J'ai atteint cela en utilisant QObject :: staticmetaObject. xxx

Voir: http://doc.qt.io/qt-5/qobject.html#staticmeTaObject-var

Si quelqu'un a une meilleure option, veuillez partager!


0 commentaires

-1
votes

Vous pouvez également consulter la fonction: qmetatype :: métaobjectfortype que

retourne qmetatype :: metaobject pour type

Mise à jour : c'est mon code, il crée une classe par nom de classe. (Notez que la classe doit être enregistrée avec qregistermetypeype (ou is qObject Base) xxx

update 2: J'ai oublié de dire. Constructeur de classe Yout doit être marqué comme q_invokable


0 commentaires