时间:2010-07-24 12:42:50

标签: c++ model-view-controller qt4 qlistview

4 个答案:

答案 0 :(得分:8)

答案 1 :(得分: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());
}

答案 2 :(得分:2)

我在2016年挖掘了你的问题......

原始解决方案的问题在于它使索引无效,即如果要在删除第五项后删除索引为5,6和7的元素,则项目编号6现在变为项目编号5,依此类推。 / p>

为了使您的解决方案有效,您无需在循环中每次评估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员工有所帮助。

答案 3 :(得分:1)

通过多行删除更加优化:

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