2010-07-24 9 views
5

¿Cómo puedo eliminar una lista de elementos seleccionados en QListView en QT 4.6. Algo como esto no funciona, el iterador de ser válida:Eliminar una lista de elementos seleccionados en QListView

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

removeRows también no es adecuado, se elimina N-artículos que sigue a la dada. Uso QStandardItemModel para almacenar elementos.

Respuesta

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

Oh, lo fácil que todos) Pero no siempre quitar. Aquí está la solución: QModelIndexList indexes = ui.listview_files-> selectionModel() -> selectedIndexes(); while (indexes.size()) { model-> removeRow (indexes.first(). Row()); indexes = ui.listview_files-> selectionModel() -> selectedIndexes(); – Yury

+1

Editado para tomar su comentario en la cuenta;) – sje397

2

No sé si se trata de un error en las nuevas versiones de Qt 4.8, pero sje397 solución no funciona para mí (en un QTreeView).

Comparto la mejor solución que encontré que consiste en ordenar los índices en orden descendente y eliminar la fila de un extremo para comenzar.

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

Aquí he excavado su pregunta en el año 2016 ...

El problema con la solución original es que invalida los índices, es decir, si desea eliminar los elementos con índices de 5, 6 y 7 Después de eliminar el quinto elemento, el elemento número seis pasa a ser el número cinco, y así sucesivamente.

Para que su solución funcione, no hay necesidad de evaluar selectionModel()->selectedIndexes() cada vez en su ciclo. El truco es comenzar desde el final e iterar de nuevo al principio. Si quita primero el artículo número 7, los artículos con los números 5 y 6 mantendrán sus posiciones.

Para darle a la gente algo de código:

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

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

Esperamos que esto ayude un poco de googler azar.

+0

Para que esto funcione, debe ordenar la lista antes de ascender. Cada vez que selecciona, el elemento seleccionado se desplaza hacia atrás a la lista. la lista puede ser así 1-9-5-4, entonces esta solución no funcionará. [selectedIndexes()] (http://doc.qt.io/qt-4.8/qabstractitemview.html#selectedIndexes) ** Esta función de conveniencia devuelve una lista de todos los índices de elementos seleccionados y no ocultos en la vista. La lista no contiene duplicados, y no está ordenada. ** –

1

la eliminación de múltiples filas es más optimizado:

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