क्या कक्षा का नाम दिए गए वर्ग के QMetaObject उदाहरण को खोजने का कोई तरीका है? मुझे डिस्क से ऑब्जेक्ट्स लोड करना है, लेकिन इसके लिए, उदाहरण के लिए QMetaObject का उपयोग करने के लिए, मुझे कक्षा के नाम का उपयोग करके QMetaObject इंस्टेंस पुनर्प्राप्त करने का एक तरीका चाहिए।मुझे क्लास नाम से क्यूटी मेटाबोजेक्ट उदाहरण कैसे मिल सकता है?
उत्तर
आप MetaClass उदाहरणों आप एक हैश या मानचित्र में की आवश्यकता होगी स्टोर कर सकते हैं, और उसके बाद जो भी नाम आप अपने मामले के लिए
के तहत उन्हें संग्रहीत उचित समाधान क्यूटी प्लगइन प्रणाली का उपयोग किया जा सकता है के माध्यम से उन्हें पुनः प्राप्त। यह साझा/गतिशील लाइब्रेरी को आसानी से लोड करने की कार्यक्षमता प्रदान करता है और जांचता है कि इसमें कुछ वांछित इंटरफ़ेस के कार्यान्वयन शामिल हैं, यदि ऐसा है - उदाहरण बनाएं। विवरण यहां पाया जा सकता है: How to Create Qt Plugins
आपको QMetaType के साथ ऐसा करने में सक्षम होना चाहिए। अपने प्रकार के ज्ञात बनाने के लिए आपको Q_DECLARE_META_TYPE()
और/या qRegisterMetaType()
की आवश्यकता हो सकती है। फिर इसे लिंक से इस उदाहरण में लगभग काम करना चाहिए:
int id = QMetaType::type("MyClass");
if (id == 0) {
void *myClassPtr = QMetaType::construct(id);
...
QMetaType::destroy(id, myClassPtr);
myClassPtr = 0;
}
मुझे हाल ही में एक ही समस्या का सामना करना पड़ रहा है। मुझे क्लास का एक उदाहरण बनाने के बिना मेटाबोजेक्ट की आवश्यकता थी। सबसे अच्छा मैं एक वैश्विक/स्थैतिक फ़ंक्शन बनाना चाहता हूं जो वर्ग नाम दिए गए qmetaobject को पुनर्प्राप्त करता है। मैंने 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;
}
देखें: http://doc.qt.io/qt-5/qobject.html#staticMetaObject-var
किसी एक बेहतर विकल्प है, तो साझा करें!
तुम भी समारोह पर एक नज़र ले जा सकते हैं: QMetaType::metaObjectForType
जो प्रकार के लिए
रिटर्न QMetaType :: metaObject
अद्यतन: मेरा कोड यह है, यह वर्ग के नाम से एक वर्ग बनाने । (ध्यान दें कि वर्ग (qRegisterMetaType साथ पंजीकृत होना जरूरी या है QObject आधार)
int typeId = QMetaType::type("MyClassName");
const QMetaObject *metaObject = QMetaType::metaObjectForType(typeId);
QObject *o = metaObject->newInstance();
MyClassName *myObj = qobject_cast<MyClassName*>(o);
अद्यतन 2:। मैं कहना भूल गया Yout वर्ग के निर्माता के रूप में चिह्नित किया जाना चाहिए Q_INVOKABLE