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 の要素を削除する場合、5 番目のアイテムを削除した後、アイテム番号 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 に答える