2012-01-13 3 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

ответ

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

0

Кажется, это происходит потому, что удаление строки удаляет элементы, связанные с строкой, поэтому может быть, что в последующих итерациях вы перебираете элементы, которые уже были удалены, что приводит к доступу к недопустимой памяти.

простой альтернативой является использование QModelIndexList, чтобы получить выбранные строки и удалить их:

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

Вот такой подход, который использует минимальный интервал QT и заменяет большинство из них с C++ 11 код/​​STL STD. (если вы предпочитаете std to 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); 
} 
Смежные вопросы