2010-03-23 1 views

Répondre

0

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

0

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

1

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; 
} 
1

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!

-1

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

Questions connexes