Как удалить все строки из QTableWidget
Я пытаюсь удалить все строки из QTableWidget. Вот что я пробовал.
for ( int i = 0; i < mTestTable->rowCount(); ++i )
{
mTestTable->removeRow(i);
}
У меня было две строки в таблице. Но это просто удалило одну строку. Причиной может быть то, что я не создал таблицу с фиксированным размером таблицы. Документация Qt для rowCount() говорит,
Это свойство содержит количество строк в таблице.
По умолчанию для таблицы, построенной без подсчета строк и столбцов, это свойство содержит значение 0.
Так что, если это так, что лучший способ удалить все строки из таблицы?
Ответы
Ответ 1
Просто установите количество строк в 0 с помощью:
mTestTable->setRowCount(0);
он автоматически удалит QTableWidgetItem
, вызвав removeRows
, как вы можете видеть в QTableWidget
внутреннем коде модели:
void QTableModel::setRowCount(int rows)
{
int rc = verticalHeaderItems.count();
if (rows < 0 || rc == rows)
return;
if (rc < rows)
insertRows(qMax(rc, 0), rows - rc);
else
removeRows(qMax(rows, 0), rc - rows);
}
Ответ 2
Я не знаю QTableWidget
, но ваш код, похоже, имеет логический недостаток. Вы забываете, что по ходу цикла вы уменьшаете значение mTestTable->rowCount()
. После того, как вы удалите одну строку, i
будет одним и mTestTable->rowCount()
также будет одним, поэтому ваш цикл остановится.
Я бы сделал это так:
while (mTestTable->rowCount() > 0)
{
mTestTable->removeRow(0);
}
Ответ 3
AFAIK setRowCount(0)
ничего не удаляет. Объекты все еще существуют, но не более заметны.
yourtable->model()->removeRows(0, yourtable->rowCount());
Ответ 4
QTableWidget test;
test.clear();
test.setRowCount( 0);
Ответ 5
Чтобы предотвратить сбой приложения, отключите все сигналы от QTableView.
// Deselects all selected items
ui->tableWidget->clearSelection();
// Disconnect all signals from table widget ! important !
ui->tableWidget->disconnect();
// Remove all items
ui->tableWidget->clearContents();
// Set row count to 0 (remove rows)
ui->tableWidget->setRowCount(0);
Ответ 6
Простым способом удаления строк является установка количества строк в ноль. Это использует removeRows() внутренне.
table->setRowCount(0);
Вы также можете очистить содержимое, а затем удалить все строки.
table->clearContents();
table->model()->removeRows(0, table->rowCount());
Оба фрагмента оставляют заголовки нетронутыми!
Если вам нужно также избавиться от заголовков, вы можете переключиться с clearContents()
на clear()
.
Ответ 7
Ваш код не удаляет последнюю строку.
Попробуйте это.
int totalRow = mTestTable->rowCount();
for ( int i = 0; i < totalRow ; ++i )
{
mTestTable->removeRow(i);
}
В вашем коде в первый раз rowCount()
есть значение 2
, а значение i
равно 0
, поэтому его удаляемая строка 1
st,
Но во второй раз значение i
увеличивается с помощью 1
, но rowCount()
возвращает обновленный счетчик строк, который теперь равен 1, поэтому он не удаляет последнюю строку.
Надеюсь, теперь вам будет ясно.
Ответ 8
Посмотрите это сообщение: http://forum.qt.io/topic/1715/qtablewidget-how-to-delete-a-row
QList<QTableWidgetItem*> items = table.findItems(.....);
QMap<int, int> rowsMap;
for(int i = 0; i < items.count(); i++{
rowsMap[items.at(i).row()] = -1; //garbage value
}
QList<int> rowsList = rowsMap.uniqueKeys();
qSort(rowsList);
//Now go through your table and delete rows in descending order as content would shift up and hence cannot do it in ascending order with ease.
for(int i = rowList.count() - 1; i >= 0; i--){
table.removeRow(rowList.at(i));
}
Ответ 9
Удаляет все элементы, не входящие в заголовки из представления. Это также удалит все варианты. Размеры таблицы остаются неизменными.
void QTableWidget::clearContents()
Удаляет все элементы в представлении. Это также удалит все варианты и заголовки.
void QTableWidget::clear()
Ответ 10
Вы можете просто добавить пустую модель товара (QStandardItemModel) в QTableView (myTableView):
itemModel = new QStandardItemModel;
ui->myTableView->setModel(itemModel);