Подтвердить что ты не робот

Как удалить все строки из QTableWidget

Я пытаюсь удалить все строки из QTableWidget. Вот что я пробовал.

for ( int i = 0; i < mTestTable->rowCount(); ++i )
{
    mTestTable->removeRow(i);
}

У меня было две строки в таблице. Но это просто удалило одну строку. Причиной может быть то, что я не создал таблицу с фиксированным размером таблицы. Документация Qt для rowCount() говорит,

Это свойство содержит количество строк в таблице.

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

Так что, если это так, что лучший способ удалить все строки из таблицы?

4b9b3361

Ответ 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);