2010-03-23 7 views
6

C'è un modo per trovare l'istanza QMetaObject di una classe, dato il nome della classe? quello che mi piace fare è caricare gli oggetti dal disco, ma perché ciò accada, ho bisogno di un modo per recuperare un'istanza QMetaObject usando il nome di una classe, in modo da usare QMetaObject per creare un'istanza.Come posso trovare un'istanza metaobject Qt da un nome di classe?

risposta

0

È possibile memorizzare le istanze metaclasse di cui avrete bisogno in un hash o mappa, per poi recuperarli via qualsiasi nome li memorizzato sotto

0

Per il vostro caso la soluzione appropriata può essere utilizzando meccanismo di plug-in Qt. Offre funzionalità per caricare facilmente la libreria condivisa/dinamica e verificare se contiene l'implementazione di alcune interfacce desiderate, in tal caso - creare l'istanza. Dettagli possono essere trovati qui: How to Create Qt Plugins

1

Si dovrebbe essere in grado di farlo con QMetaType. Potresti aver bisogno di Q_DECLARE_META_TYPE() e/o qRegisterMetaType() per rendere noti i tuoi tipi. Quindi dovrebbe funzionare più o meno come in questo esempio dal link:

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

mi hanno dovuto affrontare lo stesso problema da poco. Avevo bisogno del metaoggetto senza dover creare un'istanza della classe stessa. La cosa migliore che potrei fare è creare una funzione globale/statica che recuperi il qmetaobject dato il nome della classe. Ho raggiunto questo obiettivo utilizzando 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; 
} 

See: http://doc.qt.io/qt-5/qobject.html#staticMetaObject-var

Se qualcuno ha una soluzione migliore, si prega di condividere!

-1

Si può anche dare un'occhiata alla funzione: QMetaType::metaObjectForType che

rendimenti QMetaType :: metaObject per il tipo

Aggiornamento: Questo è il mio codice, creare una classe in base al nome della classe . (Si noti che la classe deve essere registrato presso qRegisterMetaType (o è di base QObject)

int typeId = QMetaType::type("MyClassName"); 
const QMetaObject *metaObject = QMetaType::metaObjectForType(typeId); 
QObject *o = metaObject->newInstance(); 
MyClassName *myObj = qobject_cast<MyClassName*>(o); 

Update 2:. Ho dimenticato di dire che il costruttore di classe Yout deve essere contrassegnato come Q_INVOKABLE

Problemi correlati