2014-06-23 8 views
8

मैं मोमेंटिक्स आईडीई (मूल एसडीके) का उपयोग कर ब्लैकबेरी 10 मोबाइल एप्लिकेशन विकसित कर रहा हूं।मैं कस्टम वर्ग में QVariant कैसे डाल सकता हूं?

मेरे पास एक सूचीदृश्य है जिसे मैं अपने आइटम को सी ++ के साथ क्लिक करना चाहता हूं (मुझे सी ++ क्यूएमएल का उपयोग करने की आवश्यकता नहीं है)।

मैं "कनेक्ट" निर्देश का उपयोग कर इंडेक्स पथ प्राप्त कर सकता हूं, लेकिन मुझे एक कस्टम क्लास में QVariant को पार्स करने में समस्या है;

Q_ASSERT(QObject::connect(list1, SIGNAL(triggered(QVariantList)), this, SLOT(openSheet(QVariantList)))); 

QVariant selectItem = m_categoriesListDataModel->data(indexPath); 

मैं की तरह नीचे

Category* custType = static_cast<Category*>(selectItem); 

स्थिर डाली का उपयोग करने की कोशिश की लेकिन यह रिटर्न:

"invalid static_cast from type 'QVariant' to type 'Category*'" 

किसी को भी इस पर मेरी मदद कर सकते हैं?

+0

क्या आप यह दिखाने के लिए कोड जोड़ सकते हैं कि आप मॉडल में डेटा कैसे जोड़ते हैं? – Kunal

+7

ऐसे मामलों में Q_ASSERT का उपयोग न करें! Q_ASSERT रिलीज बिल्ड में काम नहीं करेगा, और सिग्नल कनेक्ट नहीं होगा। –

उत्तर

12

आप qvariant_cast और qobject_cast का उपयोग करने का प्रयास कर सकते हैं।

QObject *object = qvariant_cast<QObject*>(selectItem); 
Category *category = qobject_cast<Category*>(object); 

इसके अलावा, कभी भी Q_ASSERT में कोई लगातार कथन न रखें। जब इसका समर्थन सक्षम नहीं होता है तो इसका उपयोग नहीं किया जाएगा।

+1

जानकारी के लिए धन्यवाद। "Q_DECLARE_METATYPE" के बारे में, मैंने इसे इस तरह की कक्षा परिभाषा में डालने की कोशिश की [उदाहरण] (http://blackberry.github.io/Qt2Cascades-Samples/docs/threads-queuedcustomtype-src-block-hpp.html) लेकिन यह काम नहीं करता यह "इस संदर्भ में" लौटाता है (मुझे लगता है कि ऐसा इसलिए है क्योंकि कक्षा एक क्यूओब्जेक्ट एक है "श्रेणी श्रेणी: सार्वजनिक क्यूओब्जेक्ट") और जब मैं इसे कक्षा परिभाषा से बाहर रखता हूं, तो यह लौटाता है कि "ब्लॉक स्कोप पर एक टेम्पलेट घोषणा नहीं दिखाई दे सकती है "। –

+0

@ user2072762: तब उत्तर अपडेट किया गया। – lpapp

+0

यह काम करता है, thx। बहुत !! –

10

संपादित करें: गैर QObject व्युत्पन्न प्रकार (देखें इस मामले के लिए अंतिम प्रतियोगिता का जवाब)

सबसे पहले, आप QVariant का हिस्सा प्रकार प्रबंधित

//customtype.h 
class CustomType { 
}; 

Q_DECLARE_METATYPE(CustomType) 
होने के लिए अपने प्रकार के लिए रजिस्टर करने की आवश्यकता के लिए काम करता है

तो फिर तुम इस तरह से QVariant से अपने कस्टम प्रकार प्राप्त कर सकते हैं:

CustomType ct = myVariant.value<CustomType>(); 

जो सम है वैलेंट:

CustomType ct = qvariant_cast<CustomType>(myVariant); 
+0

आपकी मदद के लिए धन्यवाद। मैंने आपके द्वारा वर्णित "Q_DECLARE_METATYPE" निर्देश डालने का प्रयास किया है, लेकिन यह "इस संदर्भ में" त्रुटि देता है, मुझे लगता है कि ऐसा इसलिए है क्योंकि मेरा कस्टम प्रकार QOBject क्लास से प्राप्त होता है: "श्रेणी श्रेणी: सार्वजनिक QObject" –

+0

@FinalContest सही है। प्रश्न का उल्लेख नहीं है कि आप QObject व्युत्पन्न प्रकार का इलाज कर रहे थे। – jbh

+0

आपकी टिप्पणी ने मुझे बहुत मदद की, मुझे लगता है कि तुम्हारा जवाब होना चाहिए, और यह कि ldapps को पूरी तरह से अलग प्रश्न का उत्तर होना चाहिए, क्योंकि जेएमजे ने यह निर्दिष्ट नहीं किया था कि वे मूल पोस्ट में QObject से प्राप्त कर रहे थे – snb

संबंधित मुद्दे