从QTablewidget中删除所选项目时崩溃

时间:2012-01-13 02:11:21

标签: c++ qt qtablewidget

我有一个带有以下设置的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);

3 个答案:

答案 0 :(得分:3)

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);

答案 1 :(得分:0)

这似乎发生了这种情况,因为删除行会删除与该行关联的项目,因此可能在后续迭代中迭代已删除的项目,从而导致访问无效内存。

一个简单的替代方法是使用QModelIndexList获取所选行并将其删除:

QModelIndexList indexes = ui->tableWidget->selectionModel()->selectedRows();
for (QModelIndex index : indexes) {
    ui->tableWidget->removeRow(index.row());

答案 2 :(得分:0)

这是一种使用最小QT并用C ++ 11 STD / STL代码替换大部分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);
}