2011-03-08 14 views
16

मैं क्यूएमएल में लिस्ट व्यू से एक भूमिका तक पहुंचने की कोशिश कर रहा हूं। अनिवार्य रूप से, मैं अपने QML में यह है:क्यूएमएल में एक सूचीदृश्य से आप वर्तमान इटैम की भूमिकाओं तक कैसे पहुंच सकते हैं?

ListView { 
    id: myId 
    model: myModel 
    delegate: Item { 
     Text { 
      text: model.text 
     } 
     Text { 
      text: model.moreText 
     } 
    } 
} 

myModel एक QAbstractListModel कार्यान्वयन है। इसका क्यूएमएल भाग एक पुन: प्रयोज्य घटक है, इसलिए मॉडल में विभिन्न डेटा प्रकारों के साथ कई अलग-अलग भूमिकाएं हो सकती हैं। मैं क्या करना चाहता हूं सूची सूची के currentItem संपत्ति की किसी दिए गए भूमिका के मूल्य से जुड़ा हुआ है। दूसरे शब्दों में, मैं कुछ अन्य Component पेज कि ListView में वर्तमान में चयनित आइटम के लिए एक संपत्ति के लिए बाध्य कर सकता है के रूप में इस पर करना चाहते हैं:

Text { 
    text: myId.currentItem.text // Or myId.currentItem.model.text (or something similar) 
} 

कृपया ध्यान रखें कि मैं सामान्य रूप से उपलब्ध इस की जरूरत है रखने के लिए, क्योंकि मैं इसे कई मॉडल प्रकारों के लिए बहुत कुछ करूँगा और मैं प्रत्येक मॉडल और ListView के लिए उस तरह के कस्टम कोड को लिखने की कोशिश नहीं कर रहा हूं।

ऐसा लगता है कि वर्तमान में चयनित आइटम की संपत्ति तक पहुंच बनाना आसान होना चाहिए, लेकिन जहां तक ​​मैं यह कह सकता हूं कि यह संभव नहीं है। इस तथ्य से समस्या जटिल है कि केवल एक भूमिका होने पर मॉडल अलग-अलग व्यवहार किए जाते हैं। इसका मतलब है कि कभी-कभी आप model.roleName के माध्यम से अपनी भूमिकाओं तक पहुंचते हैं, जबकि जब केवल एक ही भूमिका होती है तो आप modelData का उपयोग करते हैं।

अगर किसी के पास कोई सुझाव है, तो मैं वास्तव में इसकी सराहना करता हूं। बहुत बहुत धन्यवाद!

संपादित

मैंने पाया इस:

http://comments.gmane.org/gmane.comp.lib.qt.qml/1778

बहरहाल, यह मेरे लिए काम करने के लिए प्रकट नहीं होता। जब मैं अपनी क्यूएमएल स्क्रिप्ट में डेटा का उपयोग करने का प्रयास करता हूं तो मुझे टाइप त्रुटियां मिल रही हैं, और कोई प्रकार का कास्टिंग उपलब्ध नहीं है, इसलिए मुझे यकीन नहीं है कि क्या करना है। किसी भी सुझाव का स्वागत है!

धन्यवाद!

जैक

उत्तर

19

http://comments.gmane.org/gmane.comp.lib.qt.qml/1778 पर कोड काम करना चाहिए, हालांकि मैं त्रुटियों को देखने यदि संपत्ति 'डेटा' नाम दिया गया है करते हैं, ऐसा लगता है कि यह कुछ मौजूदा अंतर्निर्मित संपत्ति को ओवरराइड कर रहा है। 'MyData' के लिए यह नाम बदल रहा है काम करने के लिए लगता है:

ListView { 
    id: myId 
    model: myModel 
    delegate: Item { 
     property variant myData: model 
     Text { 
      text: model.text 
     } 
     Text { 
      text: model.moreText 
     }  
    } 
} 

Text { text: myId.currentItem.myData.text } 

(मूल पोस्ट में myId.currentItem.text कोड काम नहीं किया है क्योंकि यह आपका प्रतिनिधि के भीतर एक पाठ संपत्ति का उल्लेख करने के कोशिश कर रहा था है, जो modelDataमॉडल की चर्चा करते हुए बनाम प्रतिनिधि के भीतर करने के लिए मौजूद नहीं था।)

संबंध में, अंतर मॉडल के प्रकार, बजाय मॉडल में भूमिकाओं की संख्या पर निर्भर करता है। यदि मॉडल एक स्ट्रिंग सूची या ऑब्जेक्ट सूची है, modelData का उपयोग किसी प्रतिनिधि के भीतर से अलग स्ट्रिंग या ऑब्जेक्ट को संदर्भित करने के लिए किया जाता है (क्योंकि स्ट्रिंग सूचियों और ऑब्जेक्ट सूचियों में कोई भूमिका नहीं है)। QML ListModel और Qt C++ QAbstractItemModel सहित सभी अन्य मॉडलों के लिए, model.role का उपयोग प्रतिनिधि के भीतर एक भूमिका के संदर्भ में किया जा सकता है।

+0

आपकी प्रतिक्रिया के लिए बहुत बहुत धन्यवाद! हम्म ... मैंने सोचा कि यह पूरी तरह से कोशिश की है, लेकिन कुछ याद आ रही है जो मैंने याद किया है। यह जानना अच्छा लगता है कि यह किसी के लिए काम कर रहा है! मैं इस समाधान को फिर से दूंगा और देख सकता हूं कि यह चाल है या नहीं। मैं model.role और modelData के बीच स्पष्टीकरण की सराहना करता हूं। मैं आपको बता दूंगा कि चीजें कैसे निकलती हैं। एक बार फिर धन्यवाद! –

+1

ऐसा लगता है कि यह काम करता है। यकीन नहीं है कि मैं पहले क्या खो गया था। किसी भी तरह से, इस समाधान में इतनी उम्मीद है कि अब यह स्टैक ओवरफ्लो पर है, अन्य लोग इसे जल्दी से ढूंढ पाएंगे। एक बार फिर धन्यवाद! –

+0

क्या विभिन्न मॉडल प्रकारों पर सार सारण करने का कोई तरीका है? मैं पूछ रहा हूं क्योंकि मैं एक क्यूएमएल सूची मॉडल का परीक्षण कर रहा हूं और उसी क्यूएमएल कोड का उपयोग कर सी ++ एप्लिकेशन में ऑब्जेक्ट सूची के दौरान एक ऑब्जेक्ट सूची को संभालना चाहता हूं। – ssc

7

आप वैकल्पिक रूप से की तरह

Text { text: myModel[myId.currentIndex].text } 
+0

यह काम नहीं प्रतीत होता है: TypeError: अपरिभाषित –

1

सीधे मॉडल का उपयोग कर सकता है, कुछ के साथ आपको मिल() फ़ंक्शन का उपयोग कर ListModel के ListElement पहुँच सकते हैं।

Text { text: myModel.get(myId.currentIndex).text } 
+0

की संपत्ति' टेक्स्ट 'नहीं पढ़ सकता है क्या आप अपने उत्तर को आपके द्वारा प्रदान किए गए समाधान के बारे में थोड़ा और विवरण जोड़कर विस्तारित कर सकते हैं? – abarisone

+1

@abarisone myModel वह मॉडल है जिसे आप ListView को प्रदान करेंगे और myId सूची है व्यू और टेक्स्ट एक भूमिका है। उदाहरण के लिए 'ListModel { आईडी: myModel ListElement { पाठ:" एप्पल " लागत: 2.45 } ListElement { पाठ:" ऑरेंज " लागत: 3.25 } ListElement { पाठ:" केले " लागत : 1.95 } } ListView { आईडी: MyID anchors.fill: माता-पिता मॉडल: myModel प्रतिनिधि: पाठ {पाठ: टेक्स्ट} } ' –

+0

यह और भी काम करने के लिए माना जाता है कि क्या मॉडल में परिभाषित किया गया है है C++? क्योंकि मैं इसे काम नहीं कर सकता। यह कहता है कि संपत्ति प्राप्त नहीं है। – Savvas

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

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