48

我正在尝试从QTableWidget中删除所有行。这是我尝试过的。

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

我的桌子上有两行。但这只是删除了一行。一个原因可能是我没有创建具有固定表大小的表。rowCount()的 Qt 文档说,

此属性保存表中的行数。

默认情况下,对于没有行数和列数的表,此属性包含值 0。

那么如果是这种情况,从表中删除所有行的最佳方法是什么?

4

12 回答 12

104

只需将行数设置为 0:

mTestTable->setRowCount(0);

如您在内部模型代码中所见,它将QTableWidgetItem通过调用自动删除 s :removeRowsQTableWidget

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);
}
于 2013-04-06T10:33:17.450 回答
30

我不知道QTableWidget,但您的代码似乎存在逻辑缺陷。你忘记了当你在循环中你正在减少 的值mTestTable->rowCount()。删除一行后,i将是一,mTestTable->rowCount()也将是一,因此您的循环停止。

我会这样做

while (mTestTable->rowCount() > 0)
{
    mTestTable->removeRow(0);
}
于 2013-04-06T07:06:37.680 回答
13

AFAIKsetRowCount(0)什么也没删除。物体仍然存在,但不再可见。

yourtable->model()->removeRows(0, yourtable->rowCount());
于 2014-04-03T11:37:39.480 回答
8
QTableWidget test;
test.clear();
test.setRowCount( 0);
于 2014-10-16T17:14:38.753 回答
6

删除行的简单方法是将行数设置为零。这在内部使用 removeRows() 。

table->setRowCount(0);

您还可以清除内容,然后删除所有行。

table->clearContents();
table->model()->removeRows(0, table->rowCount());

两个片段都保持标题不变!

如果您也需要摆脱标题,您可以从 切换clearContents()clear().

于 2016-04-28T09:45:21.943 回答
3

为了防止应用崩溃,请断开 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);
于 2015-07-22T13:26:38.270 回答
1

看这篇文章: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));
}
于 2013-04-06T07:13:55.383 回答
1

您可以将空项目模型 (QStandardItemModel) 添加到 QTableView (myTableView):

itemModel = new QStandardItemModel;
ui->myTableView->setModel(itemModel);
于 2016-06-27T14:10:10.207 回答
0

您的代码不会删除最后一行。

试试这个。

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

在您的代码中,第一次具有is的rowCount()2和值,因此它的 delete st 行,i01

但是在第二次以i递增的值时1rowCount()返回更新后的行数,现在为 1,因此,它不会删除最后一行。

希望现在你会清楚。

于 2013-04-06T07:13:29.420 回答
0

从视图中删除所有不在标题中的项目。这也将删除所有选择。表格尺寸保持不变。

void QTableWidget::clearContents()

删除视图中的所有项目。这也将删除所有选择和标题。

void QTableWidget::clear()
于 2015-06-01T08:01:35.730 回答
0

这对我有用:

for i in reversed(range(self.tableWidget.rowCount())):
    self.tableWidget.removeRow(i)
于 2021-02-13T08:37:56.740 回答
0

python您可以将 rowCount 设置为零,这样就可以了!

tableWidget.setRowCount(0)

此代码使用 PySide6 进行测试。希望它也适用于 PyQt5 和 PyQt6。

于 2022-02-02T06:37:17.803 回答