2

我有一个具有以下设置的 QTablewidget

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

我正在尝试删除用户选择的行并使用以下代码。However, it results in a crash when all items are selected and deleted. 以下方法正确吗?谢谢。

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

可以在诺基亚开发论坛中找到这种操作略有不同的风格,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,但被迫与 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 回答