2010-07-24 12 views
5

QListView içindeki QTistView içindeki seçilmiş öğelerin listesini nasıl kaldırabilirim. Böyle şey yineleyici geçersiz olur, çalışmaz:Seçilen öğeler listesini kaldır QListView

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

removeRows da uygun değildir, bu verilen bir takip N-öğeleri kaldırır. Öğeleri depolamak için QStandardItemModel kullanıyorum.

cevap

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

Oh,. İşte çözüm: QModelIndexList indexes = ui.listview_files-> selectionModel() -> selectedIndexes(); (indexes.size()) { model-> removeRow (indexes.first(). Row()); indexes = ui.listview_files-> selectionModel() -> selectedIndexes(); – Yury

+1

Yorumunuzu dikkate almak üzere düzenlenmiş;) – sje397

2

(bir QTreeView üzerine) o Qt 4.8 yeni sürümleri bir hata var ama sje397 çözüm benim için işe yaramazsa bilmiyorum.

İndeksleri azalan sırada sıralamak için en iyi çözümü buldum ve satır baştan sona başlıyor.

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
İşte

Ben 2016 yılında sorunuzu kazılan ettik ...

orijinal solüsyon ile sorun endeksleri 5, 6 ile öğeleri kaldırmak istiyorsanız bu endekslerini, yani geçersiz olması ve 7 Beşinci öğeyi kaldırdıktan sonra, öğe numarası altı şimdi öğe sayısı beş olur ve böyle devam eder.

Çözümünüzü geliştirmek için, döngüde her zaman selectionModel()->selectedIndexes()'u değerlendirmeye gerek yoktur. Hile sondan başlamak ve tekrar baştan başlamaktır. İlk önce madde numarası 7'yi kaldırırsanız, 5 ve 6 numaralı öğeleri konumlarını koruyacaktır. Bu rastgele Google çalışanı yardımcı olacaktır

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

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

Hope:

millet size biraz kod vermek. birçok sıra ile kaldırarak

+0

Bu işi yapmak için, listeyi artan sayıdan önce sıralamanız gerekir. seçtiğiniz her zaman, seçilen öğe listeye geri itilir. Liste bu 1-9-5-4 gibi olabilir, o zaman bu çözüm işe yaramaz. [selectedIndexes()] (http://doc.qt.io/qt-4.8/qabstractitemview.html#selectedIndexes) ** Bu kolaylık işlevi, görünümde tüm seçili ve gizlenmemiş öğe dizinlerinin bir listesini döndürür. Liste çoğaltma içermiyor ve sıralanmıyor. ** –

1

daha optimize edilmiştir: hepsi) Ama her zaman değil kaldırmak ne kadar basit

QVector<QItemSelectionRange> ranges = ui.listView->selectionModel()->selection().toVector(); 
foreach (const QItemSelectionRange& range, ranges) 
{ 
    ui.listView->model()->removeRows(range.top(), range.height()); 
}