2010-07-24 40 views
5

如何删除QT 4.6中QListView中选定项目的列表。 像这样的东西是不行的,迭代器将变为无效:删除QListView中选定项目的列表

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

removeRows也是不适合的,它会删除下面给出的一个N项。 我使用QStandardItemModel来存储项目。

回答

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

哦,这一切) 但并不是多么简单总是删除。这里的解决方案: QModelIndexList indexes = ui.listview_files-> selectionModel() - > selectedIndexes(); (index.size())model-> removeRow(indexes.first()。row()); indexes = ui.listview_files-> selectionModel() - > selectedIndexes(); – Yury 2010-07-24 13:22:03

+1

编辑将您的评论考虑在内;) – sje397 2010-07-29 02:09:49

2

我不知道这是否是使用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

在这里,我发掘在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()); 
} 

希望这将帮助一些随机的Google用户。

+0

要进行此项工作,您应该在升序之前对列表进行排序。每次选择时,所选的项目都会被推回到列表中。该列表可以像这样1-9-5-4,那么这个解决方案将不起作用。 [selectedIndexes()](http://doc.qt.io/qt-4.8/qabstractitemview.html#selectedIndexes)**此便利函数返回视图中所有选定和非隐藏项目索引的列表。该列表不包含重复项,并且未被排序。** – 2016-11-01 10:00:01

1

由多行删除更加优化:

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