2012-01-13 61 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); 
}