2

次の設定のQTablewidgetがあります

tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
tableWidget->setSelectionMode(QAbstractItemView::ExtendedSelection);

ユーザーが選択した行を削除して、次のコードを使用しようとしています。ただし、すべてのアイテムを選択して削除すると、クラッシュが発生します。次のアプローチは正しいですか?ありがとう。

tableWidget->setSortingEnabled(false);
QList<QTableWidgetItem *> selectedEntries = tableWidget->selectedItems();
foreach(QTableWidgetItem * currentItem, selectedEntries) 

{       
if (currentItem->row()!=-1) 
                      tableWidget->removeRow(currentItem->row());   

}
tableWidget->setSortingEnabled(true);
4

3 に答える 3

4

この操作のわずかに異なるフレーバーは、Nokia dev forumsで見つけることができます。Ruzik によって提供される進化した形式は次のようになります。

 QSet<int> selectedRows; //we use a set to prevent doubles
 QList<QTableWidgetItem*> itemList = tableWidget->selectedItems();
 QTableWidgetItem * item;
 foreach(item, itemList)
 selectedRows.insert(item->row());
 //get a list, and sort it big to small
 QList<int> rows = selectedRows.toList();
 qSort(rows.begin(), rows.end());
 //now actually do the removing:
 foreach(int row, rows)
  tableWidget->removeRow(row);
于 2012-01-13T02:27:55.570 に答える
0

これは、行を削除すると、その行に関連付けられたアイテムが削除されるために発生するようです。そのため、後続の反復で、既に削除されたアイテムを反復処理し、無効なメモリにアクセスする可能性があります。

簡単な代替方法は、QModelIndexList を使用して選択した行を取得し、それらを削除することです。

QModelIndexList indexes = ui->tableWidget->selectionModel()->selectedRows();
for (QModelIndex index : indexes) {
    ui->tableWidget->removeRow(index.row());
于 2016-08-11T22:18:19.637 に答える
0

これは、最小限の QT を使用し、そのほとんどを C++11 STD / STL コードに置き換えるアプローチです。(私のように qt より std を好むが、qt との相互運用を余儀なくされている場合)

// make sure it is sorted descending.
std::set<int, std::greater<int>> selectedRows;
auto itemList = tableWidget->selectedItems();
for (auto& item : itemList)
{
    selectedRows.insert(item->row());
}
for (int row : selectedRows)
{
    tableWidget->removeRow(row);
}
于 2017-02-20T13:55:43.323 に答える