如何从QTableWidget中删除所有行

时间:2013-04-06 07:04:41

标签: c++ qt qtablewidget

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

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

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

  

此属性保存表中的行数。

     

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

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

11 个答案:

答案 0 :(得分:70)

使用以下命令将行计数设置为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);
}

答案 1 :(得分:28)

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

我会这样做

while (mTestTable->rowCount() > 0)
{
    mTestTable->removeRow(0);
}

答案 2 :(得分:11)

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

yourtable->model()->removeRows(0, yourtable->rowCount());

答案 3 :(得分:5)

QTableWidget test;
test.clear();
test.setRowCount( 0);

答案 4 :(得分:3)

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

table->setRowCount(0);

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

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

这两个片段都没有触及标题!

如果您还需要删除标题,则可以从clearContents()切换到clear()

答案 5 :(得分:2)

为了防止应用程序崩溃,请断开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 :(得分:0)

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

试试这个。

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

在您的代码中,第一次rowCount()的值为2i的值为0,因此删除1行,

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

希望你现在明白了。

答案 7 :(得分:0)

看这篇文章: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));
}

答案 8 :(得分:0)

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

void QTableWidget::clearContents()

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

void QTableWidget::clear()

答案 9 :(得分:0)

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

itemModel = new QStandardItemModel;
ui->myTableView->setModel(itemModel);

答案 10 :(得分:0)

这对我有用:

for i in reversed(range(self.tableWidget.rowCount())):
    self.tableWidget.removeRow(i)