2010-07-24 9 views
5

में चयनित आइटमों की एक सूची निकालें I QT 4.6 में QListView में चयनित आइटमों की सूची कैसे हटा सकते हैं। कुछ इस तरह काम नहीं करता है, इटरेटर अमान्य हो जाता है:QListView

QModelIndexList indexes = ui.listview_files->selectionModel()->selectedIndexes(); 
    foreach(QModelIndex index, indexes) 
    { 
    model->removeRow(index.row()); 
    } 

removeRows भी उपयुक्त नहीं, उसे निकाल देता एन आइटम है कि दिए गए एक प्रकार है। मैं वस्तुओं को स्टोर करने के लिए QStandardItemModel का उपयोग करता हूं।

उत्तर

6
QModelIndexList indexes; 
while((indexes = ui.listview_files->selectionModel()->selectedIndexes()).size()) { 
    model->removeRow(indexes.first().row()); 
} 
+0

ओह, कैसे सरल यह सब) लेकिन हमेशा नहीं हटा दें। यहां समाधान है: QModelIndexList अनुक्रमणिका = ui.listview_files-> चयन मॉडल() -> चयनित इंडेक्स(); जबकि (indexes.size()) { मॉडल-> removeRow (indexes.first() पंक्ति()); अनुक्रमणिका = ui.listview_files-> चयन मॉडल() -> चयनित इंडेक्स(); – Yury

+1

आपकी टिप्पणी को ध्यान में रखने के लिए संपादित किया गया;) – sje397

2

मैं अगर यह (एक QTreeView पर) क्यूटी 4.8 के नए संस्करण में एक बग है, लेकिन sje397 समाधान मेरे लिए काम नहीं करता है पता नहीं है।

मैं सबसे अच्छा समाधान साझा करता हूं जो मुझे मिला है जो सूचकांक को अवरोही क्रम में क्रमबद्ध करना है और अंत से पंक्ति को हटाने के लिए है।

QModelIndexList indexes = pTreeview->selectionModel()->selectedIndexes(); 
qSort(indexes.begin(), indexes.end(), qGreater<QModelIndex>()); 

for(iter = indexes.constBegin(); iter != indexes.constEnd(); ++iter){ 
    pModels->removeRow((*iter).row(), (*iter).parent()); 
} 
2

यहाँ मैं 2016 में अपने प्रश्न खुदाई है ...

अपने मूल समाधान के साथ समस्या यह है कि यह

सूचकांक, यानी अमान्य कर देता है आप सूचकांक 5, 6 के साथ तत्वों को निकालना चाहते हैं है, और 7 , पांचवें आइटम को हटाने के बाद, आइटम नंबर छह अब आइटम नंबर पांच बन जाता है और इसी तरह।

अपना समाधान कार्य करने के लिए, अपने लूप में हर बार selectionModel()->selectedIndexes() का मूल्यांकन करने की आवश्यकता नहीं है। यह चाल अंत से शुरू होती है और शुरुआत में फिर से शुरू होती है। यदि आप पहले आइटम नंबर 7 को हटाते हैं, तो संख्या 5 और 6 वाले आइटम उनकी स्थिति बनाए रखेंगे।

QModelIndexList selectedIndexes(listView->selectionModel()->selectedIndexes()); 

for (QModelIndexList::const_iterator it = selectedIndexes.constEnd() - 1; 
     it >= selectedIndexes.constBegin(); --it) { 
    model->removeRow(it->row()); 
} 

आशा इस कुछ यादृच्छिक गूगलर में मदद मिलेगी:

आप लोगों के लिए कुछ कोड देने के लिए।

+0

यह काम करने के लिए, आपको आरोही से पहले सूची को सॉर्ट करना चाहिए। प्रत्येक बार जब आप चुनते हैं, तो चयनित आइटम को वापस सूची में धक्का दिया जाता है। सूची 1-9-5-4 की तरह हो सकती है, तो यह समाधान काम नहीं करेगा। [चयनित इंडेक्स()] (http://doc.qt.io/qt-4.8/qabstractitemview.html#selectedIndexes) ** यह सुविधा फ़ंक्शन दृश्य में सभी चयनित और गैर-छुपा आइटम इंडेक्स की एक सूची देता है। सूची में कोई डुप्लीकेट नहीं है, और सॉर्ट नहीं किया गया है। ** –

1

एकाधिक पंक्तियों से हटाने के अधिक अनुकूलित होता है:

QVector<QItemSelectionRange> ranges = ui.listView->selectionModel()->selection().toVector(); 
foreach (const QItemSelectionRange& range, ranges) 
{ 
    ui.listView->model()->removeRows(range.top(), range.height()); 
} 
संबंधित मुद्दे