2010-07-24 12 views
5

Comment puis-je supprimer une liste d'éléments sélectionnés dans QListView dans QT 4.6. Quelque chose comme cela ne fonctionne pas, le iterator devient invalide:Supprimer une liste d'éléments sélectionnés dans QListView

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

removeRows ne conviennent pas, il supprime N-éléments qui suit celui donné. J'utilise QStandardItemModel pour stocker des éléments.

Répondre

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

Oh, la simplicité tout) Mais pas toujours retirer. Voici la solution: Index QModelIndexList = ui.listview_files-> selectionModel() -> selectedIndexes(); while (indexes.size()) { modèle-> removeRow (indexes.first(). Row()); index = ui.listview_files-> selectionModel() -> selectedIndexes(); – Yury

+1

Modifié pour prendre votre commentaire en compte;) – sje397

2

Je ne sais pas si c'est un bug dans les nouvelles versions de Qt 4.8, mais une solution sje397 ne fonctionne pas pour moi (sur un QTreeView).

Je partage la meilleure solution que j'ai trouvée qui consiste à trier les index dans l'ordre décroissant et à supprimer la ligne de début à fin.

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

Ici, j'ai excavé votre question en 2016 ...

Le problème avec votre solution originale est qu'elle annule les indices, à savoir si vous voulez supprimer des éléments avec des indices 5, 6 et 7 , après avoir supprimé le cinquième article, le numéro d'article six devient maintenant le numéro d'article cinq et ainsi de suite.

Pour que votre solution fonctionne, il n'est pas nécessaire d'évaluer selectionModel()->selectedIndexes() à chaque fois dans votre boucle. L'astuce consiste à recommencer depuis le début et à revenir au début. Si vous supprimez d'abord le numéro d'article 7, les articles portant les numéros 5 et 6 conservent leurs positions.

Pour vous donner aux gens un peu de code:

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

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

Espérons que cela aidera certains googler au hasard.

+0

Pour faire ce travail, vous devriez trier la liste avant de monter. Chaque fois que vous sélectionnez, l'élément sélectionné est repoussé vers la liste. la liste peut être comme ceci 1-9-5-4, alors cette solution ne fonctionnera pas. [selectedIndexes()] (http://doc.qt.io/qt-4.8/qabstractitemview.html#selectedIndexes) ** Cette fonction pratique renvoie une liste de tous les index d'éléments sélectionnés et non masqués dans la vue. La liste ne contient aucun doublon et n'est pas triée. ** –

1

par la suppression de plusieurs lignes est plus optimisé:

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