C++ 如何从QTableWidget中删除所有行

C++ 如何从QTableWidget中删除所有行,c++,qt,qtablewidget,C++,Qt,Qtablewidget,我正在尝试从中删除所有行。这是我试过的 for ( int i = 0; i < mTestTable->rowCount(); ++i ) { mTestTable->removeRow(i); } for(int i=0;irowCount();++i) { mTestTable->removeRow(一); } 我的桌子上有两排。但这只是删除了一行。原因可能是我没有创建具有固定表大小的表。Qt文档中说 此属性保存表中的行数 默认情况下,对于没有行和列计数的表,

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

for ( int i = 0; i < mTestTable->rowCount(); ++i )
{
    mTestTable->removeRow(i);
}
for(int i=0;irowCount();++i)
{
mTestTable->removeRow(一);
}
我的桌子上有两排。但这只是删除了一行。原因可能是我没有创建具有固定表大小的表。Qt文档中说

此属性保存表中的行数

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


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

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

我会这样做

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

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

试试这个

int totalRow = mTestTable->rowCount();
for ( int i = 0; i < totalRow ; ++i )
{
       mTestTable->removeRow(i);
}
inttotalrow=mTestTable->rowCount();
对于(int i=0;iremoveRow(一);
}
在您的代码中,第一次,
rowCount()
有值
2
,而
i
的值是
0
,因此它的删除
1
st行

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

希望你现在明白了。

看看这篇文章:

QList items=table.findItems(…);
QMap rowsMap;
对于(int i=0;i=0;i--){
表1.1(第(i)行列表);
}

只需使用以下命令将行数设置为0:

mTestTable->setRowCount(0);
它将通过调用
removows
自动删除
QTableWidgetItem
s,您可以在
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);
}
void QTableModel::setRowCount(int行)
{
int rc=verticalHeaderItems.count();
如果(行数<0 | | rc==行数)
返回;
if(rc<行)
insertRows(qMax(rc,0),rows-rc);
其他的
移除行(qMax(行,0),rc-行);
}
AFAIK
setRowCount(0)
不删除任何内容。对象仍然存在,但不再可见

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

从视图中删除标题以外的所有项目。这也将删除所有选择。表维度保持不变

void QTableWidget::clearContents()
删除视图中的所有项目。这也将删除所有选择和标题

void QTableWidget::clear()

为了防止应用程序崩溃,请断开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);

删除行的简单方法是将行数设置为零

table->setRowCount(0);
您还可以清除内容,然后删除所有行

table->clearContents();
table->model()->removeRows(0, table->rowCount());
两个代码段都保持标题不变


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

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

这对我很有用:

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

这似乎不起作用。也许当一行被删除时,索引保持不变。@ Viaya-抱歉您错了。如果您认为行的总数是2,而在第一次迭代<代码> ROONCOUNT()/代码>=2,则第一行在<代码>(i=0)< /代码>零的索引上被删除,并且在第二次迭代<代码> RONCOUNT()上被删除。=1,索引为
(i=1)
1st,因此它尝试在索引为1st时删除,但在索引为0th时,在索引为1st的行中,由于删除了第0th行,因此@Vinayan发布的代码在这里不起作用..您的逻辑是对的..实际上rowCount()并没有按原样给我2值,因为Qt给出了rowCount()=0,用于创建没有预定义行的表,如我的示例所示..感谢您的回答您的代码不起作用,您不能按其索引顺序删除这些行,因为删除一行会移动它后面所有行的索引(i=0=>要删除的下一行仍然是i=0)。如果必须使用索引,则可以按相反顺序删除该行,这样删除一个索引不会使其他索引“无效”(
for(int i=totalRow-1;i>0;--i)
)。这可能会起作用..但删除几行似乎需要很多代码:)这只适用于删除一组特定的行。这并不是一个很好的解决方案,因为它在大数据上的速度非常慢
removeRow(mTestTable->rowCount()-1)
预计会快得多。这是一个相当糟糕的解决方案,因为
QTableWidget
s具有大量行,这将花费大量时间。最好在答案中为代码添加一些注释或解释。这是最简单的方法。另外,setRowCount(0)的+1不会删除任何内容,请参见下面的@damkrat答案。这会删除所有内容。也许@damkrat是对的,setRowCount(0)什么也不删除,但是clear()-删除。clear()删除所有项目,但表维度保持不变。这与公认的答案相矛盾。哪一个是正确的?两个都试试。在我的自定义模型中,我是这样做的,因为setRowCount并没有从模型中清除行。我的Qt版本是4.4.xYou不应该使用带有
QTableWidget
的自定义模型,内部模型
QTableModel
是私有的,不是Qt API的一部分,因此您不能正确地将其子类化。而且,如果您的自定义模型不是从
QT继承的,那么因为'QTableWidget'在调用每个
QTableModel
函数之前使用
qobject\u cast
,而没有检查强制转换是否成功
table->clearContents();
table->model()->removeRows(0, table->rowCount());
itemModel = new QStandardItemModel;
ui->myTableView->setModel(itemModel);
for i in reversed(range(self.tableWidget.rowCount())):
    self.tableWidget.removeRow(i)