C++ 从QTablewidget删除所选项目时崩溃

C++ 从QTablewidget删除所选项目时崩溃,c++,qt,qtablewidget,C++,Qt,Qtablewidget,我有一个QTablewidget,具有以下设置 tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); tableWidget->setSelectionMode(QAbstractItemView::ExtendedSelection); 我正在尝试删除用户选择的行并使用以下代码。但是,当选择并删除所有项目时,会导致崩溃。以下方法正确吗?谢谢 tableWidget->setSortingEnabl

我有一个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);
tableWidget->setSortingEnabled(false);
QList selectedEntries=tableWidget->selectedItems();
foreach(QTableWidgetItem*currentItem,selectedEntries)
{       
如果(currentItem->row()!=-1)
tableWidget->removeRow(currentItem->row());
}
tableWidget->setSortingEnabled(真);

在中可以找到与此操作稍有不同的风格,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);
QSet selectedRows//我们用一套来防止双打
QList itemList=tableWidget->selectedItems();
QTableWidgetItem*项目;
foreach(项目,项目列表)
selectedRows.insert(项目->行());
//获取一个列表,并将其从大到小排序
QList rows=selectedRows.toList();
qSort(rows.begin(),rows.end());
//现在实际执行以下操作:
foreach(int行,行)
tableWidget->removeRow(行);

在中可以找到与此操作稍有不同的风格,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);
QSet selectedRows//我们用一套来防止双打
QList itemList=tableWidget->selectedItems();
QTableWidgetItem*项目;
foreach(项目,项目列表)
selectedRows.insert(项目->行());
//获取一个列表,并将其从大到小排序
QList rows=selectedRows.toList();
qSort(rows.begin(),rows.end());
//现在实际执行以下操作:
foreach(int行,行)
tableWidget->removeRow(行);

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

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

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

这似乎是因为删除该行会删除与该行关联的项,因此在后续迭代中,您可能会对已删除的项进行迭代,从而导致访问无效内存

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

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

这里有一种使用最小QT并用C++11 STD/STL代码替换大部分QT的方法。(如果您像我一样喜欢std而不是qt,但被迫与qt进行互操作)

//确保按降序排序。
std::set selectedRows;
auto itemList=tableWidget->selectedItems();
用于(自动项目:项目列表(&T)
{
selectedRows.insert(项目->行());
}
for(int行:selectedRows)
{
tableWidget->removeRow(行);
}

这里有一种方法,它使用最少的QT,并用C++11 STD/STL代码替换大部分QT。(如果您像我一样喜欢std而不是qt,但被迫与qt进行互操作)

//确保按降序排序。
std::set selectedRows;
auto itemList=tableWidget->selectedItems();
用于(自动项目:项目列表(&T)
{
selectedRows.insert(项目->行());
}
for(int行:selectedRows)
{
tableWidget->removeRow(行);
}

您知道它在哪里崩溃吗?有堆栈跟踪吗?你知道它在哪里崩溃吗?有堆栈跟踪吗?回答得很好。我自己用过这个。。。尽管我不得不更改qSort(rows.begin(),rows.end());到qSort(rows.begin()、rows.end()、qgrear());回答得很好。我自己用过这个。。。尽管我不得不更改qSort(rows.begin(),rows.end());到qSort(rows.begin()、rows.end()、qgrear());