如何从QTableWidget中删除所有行

vin*_*yan 34 c++ qt qtablewidget

我试图从QTableWidget中删除所有行.这是我试过的.

for ( int i = 0; i < mTestTable->rowCount(); ++i )
{
    mTestTable->removeRow(i);
}
Run Code Online (Sandbox Code Playgroud)

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

此属性保存表中的行数.

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

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

ale*_*sdm 75

只需将行计数设置为0:

mTestTable->setRowCount(0);
Run Code Online (Sandbox Code Playgroud)

它会QTableWidgetItem自动删除s,通过调用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);
}
Run Code Online (Sandbox Code Playgroud)


joh*_*ohn 28

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

我会这样做的

while (mTestTable->rowCount() > 0)
{
    mTestTable->removeRow(0);
}
Run Code Online (Sandbox Code Playgroud)

  • 这不是一个很好的解决方案,因为大数据可能会非常慢.`removeRow(mTestTable-> rowCount() - 1)`预计要快得多. (5认同)
  • 这是一个相当糟糕的解决方案,对于QTableWidget来说,这行需要大量的时间. (2认同)

小智 11

AFAIK setRowCount(0)什么都没删除.物体仍在那里,但不再可见.

yourtable->model()->removeRows(0, yourtable->rowCount());
Run Code Online (Sandbox Code Playgroud)


Jen*_*och 6

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

table->setRowCount(0);
Run Code Online (Sandbox Code Playgroud)

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

table->clearContents();
table->model()->removeRows(0, table->rowCount());
Run Code Online (Sandbox Code Playgroud)

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

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


小智 5

QTableWidget test;
test.clear();
test.setRowCount( 0);
Run Code Online (Sandbox Code Playgroud)

  • 在答案中为代码添加一些注释或解释会很好. (4认同)