Qt QTableWidge遍历删除行的问题
@
问题
QTableWidget
遍历删除时容易写成下面这种写法
for (int i = 0; i < ui->tableWidget_3->rowCount(); --i)
{
ui->tableWidget_3->removeRow(i);
}
这种写法的问题:
- for循环的条件是
i < 表行数
,问题在于每次循环会移除一行,下次循环时表行数会减少,就会出现不能完全遍历的问题 - 循环体中每次循环会移除第
i
行,然而每次循环之后会移除前一行,那么后一行就会变成前一行,这样每次循环就变成了跳行移除
解决办法
- 正确写法1
- 先获取表的总行数,做为循环条件,保持循环次数不变
- 每次循环时,只删除起始行,前一行移除后下一行会自动移到前一行
int rowCount = ui->tableWidget_3->rowCount();
int start = 0;
for (int i = start; i < rowCount; ++i)
{
ui->tableWidget_3->removeRow(start);
}
- 正确写法2
- 从后往前遍历,因为行号的索引是从0开始的,所以
i
的起始值为表的行数减1
- 每次移除第
i
行 ,也就是从最后一行开始移除
- 从后往前遍历,因为行号的索引是从0开始的,所以
for (int i = ui->tableWidget_3->rowCount() - 1; i >= 0; --i)
{
ui->tableWidget_3->removeRow(i);
}
其它
当然,如果你想删除所有行的话可以直接调用QTableWidget
的void QTableWidget::setRowCount(int rows)
函数,将参数直接设置为0,QTableWidget
将会直接丢弃所有行
ui->tableWidget_3->setRowCount(0);