2011-05-30 8 views
5

QVariantQList<QVariant> स्वीकार करता है और QVector<QVariant> और न ही QLinkedList<QVariant> स्वीकार करता है। क्या यह बस इसलिए है क्योंकि यह QList, QVector और QLinkedList मूल रूप से समान (एक अमूर्त अर्थ में) डेटा संरचनाओं के रूप में देखता है?क्या कोई कारण है कि QVariant केवल QList स्वीकार करता है और QVector और न ही QLinkedList

मैं जोड़ रहा हूं और std::vectorQVariant पर जोड़ रहा हूं।

  1. std::vector से QVector
  2. करने के लिए QVector से QList

पुनश्च:: केवल क्यूटी एपीआई और नहीं एक मैनुअल रूपांतरण का उपयोग करते हैं, तो यह दो रूपांतरण की आवश्यकता है मुझे पता है कि मैं जोड़ सकते हैं कर रहा हूँ std::vector से QVariant सीधे this के साथ लेकिन मुझे विश्वास है कि उस मामले में यह नहीं पता होगा कि यह वस्तुओं का एक वेक्टर है।

+0

मैं जो पूछ रहा हूं उसके बारे में उलझन में हूं।सबसे पहले आप QVariants की सूचियों और वैक्टरों पर चर्चा करते हैं, फिर आप एक QVariant में std :: वेक्टर को संग्रहीत करने पर चर्चा करते हैं? क्या यहां दो अलग-अलग प्रश्न हैं? – Nathanael

+0

'बूस्ट :: किसी भी' का उपयोग क्यों नहीं करें? – Puppy

+0

पहला सवाल फोकस है। दूसरा कथन बस वर्णन करता है कि मैं इसके लिए क्या उपयोग कर रहा हूं। –

उत्तर

4

बस इसलिए कि क्यूलिस्ट अब तक का सबसे अधिक इस्तेमाल किया जाने वाला कंटेनर प्रकार है, और अन्य सभी के लिए अधिभार जोड़ना क्यूवीरिएंट इंटरफेस को पहले से कहीं अधिक जटिल बना देगा। किसी भी मामले में, आपकी समस्या यह नहीं प्रतीत होती है कि QVariant QVector का समर्थन नहीं करता है (यह थोड़ा काम करता है) लेकिन QJson नहीं करता है। मुझे संदेह है कि QVector :: toList() के लिए एक अतिरिक्त कॉल एक महत्वपूर्ण प्रदर्शन ओवरहेड का कारण बनता है।

0

मैं QVariant के कार्यान्वयन के 100% निश्चित नहीं हूं, लेकिन मेरा मानना ​​है कि एक QVariant का आकार रन टाइम तक निर्धारित नहीं होता है। इसका अर्थ यह है कि यदि आप QVector < QVariant लिखने का प्रयास करते हैं> संकलक को पता नहीं है कि आवंटित करने के लिए कितनी जगह है, इसलिए यह एक त्रुटि की रिपोर्ट करता है। LinkedList के लिए भी यही सच है। क्यूलिस्ट काम करता है क्योंकि यह कार्यान्वयन पॉइंटर्स पर कड़ाई से निर्भर करता है।

मुझे लगता है कि आप पाएंगे कि QVector < QVariant *> बस ठीक है।

बिग चेतावनी: मैं एक क्यूटी विशेषज्ञ नहीं हूं, इसलिए मैं इस पर बंद हो सकता हूं। लेकिन उम्मीद है कि कम से कम यह आपको सही दिशा में सोचने में मदद करता है।

+0

किसी भी प्रकार के लिए, आकार संकलन समय पर जाना जाना चाहिए। यदि आप रनटाइम तक आकार नहीं जानते हैं, तो आपको ढेर पर भरोसा करना होगा, इस स्थिति में वास्तविक संरचना का आकार अभी भी सूचक के आकार के रूप में जाना जाएगा। –

10

qRegisterMetaType फ़ंक्शन पर कॉल करने के बाद, आप QVariant में सबकुछ स्टोर कर सकते हैं।

इसलिए यदि आप qRegisterMetaType<std::vector<SomeObject> >("std::vector<SomeObject>"); QVariant को स्टोर करते हैं तो std :: vector स्टोर करें। से इस तरह के मूल्यों को पढ़ने के समारोह T QVariant::value() const प्रदर्शन उपयोग समारोह लिखने के लिए, void QVariant::setValue (const T & value)

पुनश्च: मुझे पता है कि मैं इस के साथ सीधे QVariant को std :: वेक्टर जोड़ सकते हैं कर रहा हूँ, लेकिन मुझे विश्वास है कि इस मामले में ऐसा नहीं होगा पता है कि यह वस्तुओं का एक वेक्टर है।

जब आप प्रकार को QVariant में पंजीकृत करते हैं, तो यह उस प्रकार के आइटमों को जोड़ते समय इसे डिफॉल्ट कन्स्ट्रक्टर, कॉपी कन्स्ट्रक्टर और विनाशक कहते हैं। तो कक्षाओं और वस्तुओं के साथ इसका उपयोग करने के लिए कोई नुकसान नहीं है।

+0

हां, लेकिन समस्या यह है कि मैं चाहता हूं कि 'QVariant' को अन्य लाइब्रेरी द्वारा आइटम्स के संग्रह के रूप में पहचाना जाए जो Qt प्रकार ([QJson] (http://qjson.sourceforge.net/) की अपेक्षा करता है)। मैं QJson का उपयोग कर रहा हूं जो 'QVariant' के साथ काम करता है और यह नहीं जानता कि" उपयोगकर्ता परिभाषित "प्रकार जैसे' std :: vector' के साथ क्या करना है। –

1

इन जैसे टेम्पलेटेड वर्गों के लिए, आपको अलग-अलग मेटा सिस्टम के साथ प्रत्येक विशिष्ट त्वरण को पंजीकृत करना होगा। जाहिर है, ट्रॉल्स को QList<QVariant> का उपयोग करने की आवश्यकता महसूस हुई, लेकिन दूसरों में से कोई भी नहीं, इसलिए उन्होंने केवल एक पंजीकृत किया। कोई विशिष्ट कारण नहीं है कि आप उन्हें स्वयं पंजीकृत नहीं कर सके।

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