2012-01-13 100 views
1

删除所选的项目我有一个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); 
+0

你知道它崩溃的地方吗?是否有堆栈跟踪? – Karlson 2012-01-13 02:26:01

回答

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

很棒的回答。尽管我必须改变qSort(rows.begin(),rows.end());到qSort(rows.begin(),rows.end(),qGreater ()); – CurtisJC 2014-10-13 11:02:51

0

看来,这是因为移除该行删除相关的项目与该行相同,因此可能会在随后的迭代中迭代已删除的项目,导致访问无效的内存。

一个简单的选择是使用QModelIndexList获得所选行并删除它们:

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

下面是一个使用最小QT和替代大部分是用C++ 11 STD/STL代码的方法。 (如果你喜欢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); 
}