代码之家  ›  专栏  ›  技术社区  ›  Yury

删除QlistView中所选项目的列表

  •  6
  • Yury  · 技术社区  · 14 年前

    如何删除qt 4.6中qlistView中选定项的列表。 类似这样的情况不起作用,迭代器无效:

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

    去除剂也不合适,它去除了后面给出的n项。 我使用qStandardItemModel来存储项目。

    4 回复  |  直到 7 年前
        1
  •  8
  •   sje397    14 年前
    QModelIndexList indexes;
    while((indexes = ui.listview_files->selectionModel()->selectedIndexes()).size()) { 
        model->removeRow(indexes.first().row()); 
    }
    
        2
  •  3
  •   SaiyanRiku    12 年前

    我不知道这是否是Qt4.8的新版本中的一个bug,但是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());
    }
    
        3
  •  2
  •   peter.slizik    9 年前

    我在这里挖掘了你在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());
    }
    

    希望这能帮助一些随机谷歌。

        4
  •  1
  •   indalive    7 年前

    多行删除更为优化:

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