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. P>
5 Réponses :
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 p>
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 P>
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;
}
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. Voir: http://doc.qt.io/qt-5/qobject.html#staticmeTaObject-var p> Si quelqu'un a une meilleure option, veuillez partager! p> p>
Vous pouvez également consulter la fonction: qmetatype :: métaobjectfortype code>
que
retourne qmetatype :: metaobject pour type p> blockQuote>
Mise à jour forte>: 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) p> xxx pré> update 2: strong> J'ai oublié de dire. Constructeur de classe Yout doit être marqué comme q_invokable em> p> p>