2010-07-24 12 views
5

Come è possibile rimuovere un elenco di elementi selezionati in QListView in QT 4.6. Qualcosa di simile a questo non funziona, l'iteratore perde la sua validità:Rimuovere un elenco di elementi selezionati in QListView

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

removeRows anche non adatto, rimuove N-elementi che segue quella data. Io uso QStandardItemModel per memorizzare gli articoli.

risposta

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

Oh, come sia semplice tutto) Ma non elimina sempre. Ecco la soluzione: QModelIndexList indexes = ui.listview_files-> selectionModel() -> selectedIndexes(); while (indexes.size()) { model-> removeRow (indexes.first(). Row()); indexes = ui.listview_files-> selectionModel() -> selectedIndexes(); – Yury

+1

Modificato per tenere in considerazione il tuo commento;) – sje397

2

Non so se si tratta di un bug nelle nuove versioni di Qt 4.8, ma la soluzione sje397 non funziona per me (su un QTreeView).

Condivido la soluzione migliore che ho trovato che è ordinare gli indici in ordine decrescente e rimuovere riga dalla fine per iniziare.

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

Qui ho scavato la tua domanda nel 2016 ...

Il problema con la soluzione originale è che annulla gli indici, cioè se si desidera rimuovere gli elementi con gli indici 5, 6 e 7 , dopo aver rimosso il quinto elemento, l'articolo numero sei diventa l'articolo numero cinque e così via.

Per far funzionare la soluzione, non è necessario valutare selectionModel()->selectedIndexes() ogni volta nel ciclo. Il trucco è iniziare dalla fine e scorrere fino all'inizio. Se rimuovi prima il numero dell'articolo 7, gli articoli con i numeri 5 e 6 manterranno le loro posizioni.

Per darvi gente po 'di codice:

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

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

Spero che questo vi aiuterà un po' Googler casuale.

+0

Per fare in modo che funzioni, è necessario ordinare l'elenco prima di salire. ogni volta che si seleziona, la voce selezionata viene reinserita nell'elenco. la lista può essere come questa 1-9-5-4, quindi questa soluzione non funzionerà. [selectedIndexes()] (http://doc.qt.io/qt-4.8/qabstractitemview.html#selectedIndexes) ** Questa funzione di convenienza restituisce un elenco di tutti gli indici di elementi selezionati e non nascosti nella vista. L'elenco non contiene duplicati e non è ordinato. ** –

1

rimozione da parte di più righe è più ottimizzato:

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