2010-07-24 5 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(); while (indexes.size()) { model-> removeRow (indexes.first(). 행()); indexes = ui.listview_files-> selectionModel() -> selectedIndexes(); – Yury

+1

귀하의 의견을 고려하여 편집 됨) – sje397

2

(A QTreeView에)는 Qt는 4.8의 새로운 버전의 버그하지만 sje397 솔루션은 나를 위해 작동하지 않는 경우 모르겠어요.

색인을 내림차순으로 정렬하고 끝에서 행을 제거하는 것이 가장 좋은 해결책을 발견했습니다.

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
여기

I 2016에서 질문을 발굴했습니다 ...

원래 솔루션의 문제는 인덱스 5, 6 요소를 제거 할 경우는 인덱스, 즉 무효이다, 7 다섯 번째 항목을 제거한 후 항목 번호 6은 이제 항목 번호 5가됩니다.

솔루션을 작동 시키려면 매번 루프에서 selectionModel()->selectedIndexes()을 (를) 평가할 필요가 없습니다. 트릭은 끝에서부터 시작하여 다시 처음부터 반복하는 것입니다. 항목 번호 7을 먼저 제거하면 숫자 5와 6이있는 항목의 위치가 유지됩니다. 이것은 어떤 임의의 Google 직원 도움이 될 것입니다

QModelIndexList selectedIndexes(listView->selectionModel()->selectedIndexes()); 

for (QModelIndexList::const_iterator it = selectedIndexes.constEnd() - 1; 
     it >= selectedIndexes.constBegin(); --it) { 
    model->removeRow(it->row()); 
} 

희망 :

은 사람들에게 몇 가지 코드를 제공합니다. 여러 행에 의해 제거

+0

이 작업을 수행하려면 오름차순으로 목록을 정렬해야합니다. 각 시간을 선택하면 선택한 항목이 목록으로 다시 푸시됩니다. 목록은 1-9-5-4와 같을 수 있습니다. 그러면이 솔루션은 작동하지 않습니다. [selectedIndexes()] (http://doc.qt.io/qt-4.8/qabstractitemview.html#selectedIndexes) **이 편리한 함수는 뷰에서 선택된 항목 인덱스와 숨겨진 항목 인덱스의 목록을 반환합니다. 목록에 중복이 없으며 정렬되지 않았습니다. ** –

1

더 최적화되어 있습니다 : 모든) 하지만 항상 제거하는 방법을 간단

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