Удалить список выбранных элементов в QListView - PullRequest
6 голосов
/ 24 июля 2010

Как я могу удалить список выбранных элементов в QListView в QT 4.6.Что-то вроде этого не работает, итератор становится недействительным:

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

removeRows также не подходит, он удаляет N-элементов, следующих за данным.Я использую QStandardItemModel для хранения предметов.

Ответы [ 4 ]

8 голосов
/ 24 июля 2010
QModelIndexList indexes;
while((indexes = ui.listview_files->selectionModel()->selectedIndexes()).size()) { 
    model->removeRow(indexes.first().row()); 
}
3 голосов
/ 12 февраля 2013

Я не знаю, является ли это ошибкой в ​​новых версиях Qt 4.8, но решение sje397 не работает для меня (на QTreeView).

Я поделюсь лучшим решением, которое я нашел, которое заключается в сортировкеиндексирует в порядке убывания и удаляет строку от конца к началу.

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 голосов
/ 30 мая 2016

Здесь я раскопал ваш вопрос в 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());
}

Надеюсь, это поможет случайному гуглеру.

1 голос
/ 23 января 2018

удаление по нескольким строкам более оптимизировано:

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