2010-03-23 11 views
6

Sınıf adı verilen bir sınıfın QMetaObject örneğini bulmanın bir yolu var mı? Yapmayı sevdiğim şey disketten nesne yüklemektir, ancak bunun olması için, bir örnek oluşturmak için QMetaObject'i kullanmak için bir QMetaObject örneğini bir sınıfın adını kullanarak almanın bir yoluna ihtiyacım var.Bir sınıf adından Qt metaobject örneğini nasıl bulabilirim?

cevap

0

Sen uygun bir çözüm Qt eklentisi mekanizmasını kullanarak edilebilir sizin durumunuzda için

0

altında saklanan ne olursa olsun adı aracılığıyla onları almak o zaman bir Hash veya Harita gerekecektir metaclass örneklerini saklayabilir ve edebilirsiniz. Paylaşılan/dinamik kitaplığı kolayca yüklemek ve istenen arabirimin uygulanıp uygulanmadığını kontrol etmek için işlevsellik sunar, eğer öyleyse örneği oluşturun. Ayrıntılar şu adreste bulunabilir: How to Create Qt Plugins

1

Bunu QMetaType ile yapabilmeniz gerekir. Türlerinizi bilinen hale getirmek için Q_DECLARE_META_TYPE() ve/veya qRegisterMetaType()'a ihtiyacınız olabilir. Daha sonra bu örnekte kabaca şu şekilde çalışılmalıdır:

1

Son zamanlarda aynı problemle karşı karşıyayım. Sınıfın kendisinin bir örneğini oluşturmaya gerek kalmadan meta-nesneye ihtiyacım vardı. Yapabileceğim en iyi şey, sınıf adı verilen qmetaobject öğesini geri alan global/statik bir işlev oluşturmaktır. QObject :: staticMetaObject kullanarak bunu başardım.

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

Bkz: Biri daha iyi bir seçenek varsa http://doc.qt.io/qt-5/qobject.html#staticMetaObject-var

, lütfen paylaşın!

-1

Ayrıca fonksiyonuna bir göz atabilirsiniz: QMetaType::metaObjectForType türü için hangi

döner QMetaType :: metaObject

Güncelleme: Gördüğüm kod bu, bu sınıf adıyla bir sınıf oluşturmak . (2

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

Güncelleme) sınıfı QObject tabanını qRegisterMetaType kayıtlı (veya olması gerektiğini unutmayın. Söyleyecek unutmuş yout sınıfının yapıcı işaretlenmesi gerekir

Q_INVOKABLE olarak
İlgili konular