2010-03-23 12 views

Antwort

0

können Sie speichern die MetaClass Instanzen, die Sie in einem Hash oder Karte benötigen, und rufen sie dann über einen beliebigen Namen sie gespeichert unter

0

Für Ihren Fall die passende Lösung kann unter Verwendung von Qt Plugin-Mechanismus werden. Es bietet Funktionen zum einfachen Laden der freigegebenen/dynamischen Bibliothek und prüft, ob es die Implementierung einer gewünschten Schnittstelle enthält. Wenn ja, erstellen Sie die Instanz. Details finden Sie hier: How to Create Qt Plugins

1

Sie sollten in der Lage sein, dies mit QMetaType zu tun. Sie benötigen möglicherweise Q_DECLARE_META_TYPE() und/oder qRegisterMetaType(), um Ihre Typen bekannt zu machen. Dann sollte es ungefähr wie in diesem Beispiel von der Verbindung funktionieren:

1

Ich habe in letzter Zeit das gleiche Problem konfrontiert. Ich brauchte das Metaobjekt, ohne eine Instanz der Klasse selbst erstellen zu müssen. Am besten kann ich eine globale/statische Funktion erstellen, die das qmetaObject anhand des Klassennamens abruft. Das habe ich mit QObject :: staticMetaObject erreicht.

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

Wenn jemand eine bessere Möglichkeit hat, bitte teilen!

-1

können Sie auch einen Blick auf die Funktion: QMetaType::metaObjectForType dem

kehrt QMetaType :: metaObject für Typ

aktualisieren: Das ist mein Code, eine Klasse von Klassennamen erstellen . (Beachten Sie, dass die Klasse muss mit qRegisterMetaType registriert sein (oder ist QObject Basis)

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

Update 2:. ich vergessen habe zu sagen, Yout Klasse Konstruktor markiert werden müssen Q_INVOKABLE