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