6

如何在 QT 4.6 中删除 QListView 中的选定项目列表。这样的事情不起作用,迭代器变得无效:

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

removeRows 也不合适,它会删除给定项之后的 N 项。我使用 QStandardItemModel 来存储项目。

4

4 回答 4

9
QModelIndexList indexes;
while((indexes = ui.listview_files->selectionModel()->selectedIndexes()).size()) { 
    model->removeRow(indexes.first().row()); 
}
于 2010-07-24T12:53:27.007 回答
3

我不知道这是否是 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());
}
于 2013-02-12T13:08:48.430 回答
2

在这里,我在 2016 年挖掘了您的问题......

原始解决方案的问题在于它使索引无效,即如果您想删除索引为 5、6 和 7 的元素,在删除第五个项目后,第 6 个项目现在变为第 5 个项目,依此类推。

为了使您的解决方案有效,无需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());
}

希望这会帮助一些随机的谷歌用户。

于 2016-05-30T09:42:32.050 回答
1

多行删除更优化:

QVector<QItemSelectionRange> ranges = ui.listView->selectionModel()->selection().toVector();
foreach (const QItemSelectionRange& range, ranges) {
    ui.listView->model()->removeRows(range.top(), range.height());
}
于 2018-01-23T11:22:44.533 回答