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