2011-11-15 18 views
5

मैं एक बहु-चयन एक आइटम प्रतिनिधि (QStyledItemDelegate) मैं मदों के लिए आकार सेट और कस्टम रंग करने के लिए उपयोग करने के साथ QListView सक्षम होनी मदों के लिए लम्बे आइटम पंक्तियों। मेरे आवश्यकताओं अत्यंत सरल कर रहे हैं:QTListView - चयनित

  1. पंक्ति ऊँचाई 30 गैर चयनित आइटम
  2. पंक्ति ऊँचाई 60 के लिए चयनित किया

मदों के लिए यह काम करने के लिए नहीं कर सकते हैं।

मेरी QStyledItemDelegate

if (option.state & QStyle::State_Selected) 
{ 
    return QSize(100,60); /// <<<<------ NEVER REACHED 
} 
else 
{ 
    return QSize(100,30); 
} 

राज्य का चयन किया कभी नहीं किया गया है पर sizeHint का उपयोग कर जो अजीब है क्योंकि एक ही अगर बयान एक ही कक्षा पर चित्रकला विधि के लिए पूरी तरह से काम करता है, चयनित पंक्तियों और अचयनित के बीच भेद की कोशिश की विभिन्न रंग पृष्ठभूमि के लिए पंक्तियां।

तो मैं किसी और

मैं चयन मॉडल (QItemSelectionModel) मेरी प्रतिनिधि पर sizeHint विधि के लिए सुलभ बना दिया कुछ करने की कोशिश की। इसका उपयोग करके मैं सफलतापूर्वक क्वेरी कर सकता हूं यदि सिज़हिंट की पंक्ति को चुना गया है या नहीं और मैं सही आकार लौटा रहा हूं। हालांकि अब केवल सही चर आकार में ड्राइंग किया जाता है। चयनित वस्तुओं के लिए, ड्राइंग में अब 60 की ऊंचाई है, जो सही है, लेकिन यह नीचे के आइटम को ओवरलैप करता है। दूसरे शब्दों में: नई sizeHint आकार केवल ड्राइंग के लिए प्रयोग किया जाता है, लेकिन वास्तव में QListView आइटम बनाने लम्बे के लिए नहीं। ऐसा लगता है कि सूची को "अद्यतन" करने के लिए एक लापता कॉल है, देखें कि इसकी एक वस्तु आकार में बदल गई है। मुझे केवल आइटम को लम्बा करने की आवश्यकता नहीं है, मुझे उस उद्देश्य के लिए पर की आवश्यकता है।

ऐसा लगता है कि sizeHint केवल शुरुआत में आइटम ऊंचाई पर प्रभाव है जब सब कुछ आरंभ नहीं हो जाता। यदि आप अचानक अपने आकार के आइटमों में से किसी एक के लिए उच्च ऊंचाई मान लौटते हैं - यह नई ऊंचाई को समायोजित करने के लिए सूचीदृश्य में वृद्धि नहीं करेगा।

एक दिलचस्प अवलोकन:

अगर मैं setResizeMode सेट (QListView :: समायोजित करें) मेरी QListView पर, नियंत्रित करने के लिए एक मामूली आकार सभी वस्तुओं के एक फिर से calc ट्रिगर किया जाएगा, के आकार फिक्सिंग वास्तविक चयनित आइटम जैसे ड्राइंग (जिसे हमेशा सही ऊंचाई में किया जाता है) आइटम की ऊंचाई के नीचे आइटम के नीचे नीचे कैस्केड नहीं होता है। चयन परिवर्तन के रूप में मुझे यह करने की ज़रूरत है, QLiustView :: कारणों को समायोजित करने जैसे "पुनः-कैल्क" का कारण बनता है। मैं उसको कैसे करू?

क्या मैं अब कर रहा हूँ बदसूरत है, और मैं सकारात्मक यह यह करने के लिए तरीका नहीं है, लेकिन मैं कोई अन्य विकल्प नहीं है। मैं चयन मॉडल पर झुका रहा हूं - चयन में बदलाव सुन रहा हूं, और जब वे आते हैं, तो मैं अपनी क्यूलिस्ट व्यू की ऊंचाई 1 से बदलता हूं और फिर मूल आकार पर वापस जाता हूं। यह आइटम आकारों का एक पुनर्मूल्यांकन उत्पन्न करता है (setResizeMode (QListView :: समायोजित करें) और सबकुछ ठीक दिखता है और ठीक काम करता है। मुझे ऐसा करने से परेशान हो जाता है - क्या आइटम को उनकी ऊंचाई को फिर से कैलक करने का कोई बेहतर तरीका नहीं है QListView का आकार बदलने के द्वारा?

उत्तर

1

शीर्ष नोकिया क्यूटी डेवलपर्स के साथ की पुष्टि की - हैक मैं जाहिरा तौर पर कर रहा हूँ केवल इस बात किया जाना तरीका है:

क्या मैं अब कर रहा हूँ बदसूरत है, और मैं सकारात्मक यह है कर रहा हूँ ऐसा करने का कोई तरीका नहीं, लेकिन मेरे पास कोई अन्य विकल्प नहीं है। मैं चयन मॉडल के लिए ऊपर hooking हूँ - चयन परिवर्तन पर सुन, और जब वे आते हैं, मैं 1 से मेरी QlistView की ऊंचाई का आकार बदलने और फिर वापस मूल आकार में जाते हैं। यह आइटम की एक पुनर्गणना आकार (setResizeMode (QListView :: समायोजित करें) उत्पन्न करता है और सब कुछ दिखता है और ठीक काम करता है

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