咸鱼DoYoung  
做一条有理想的咸鱼

Qt QTableWidge遍历删除行的问题

@

问题

QTableWidget遍历删除时容易写成下面这种写法

	for (int i = 0; i < ui->tableWidget_3->rowCount(); --i)
	{
		ui->tableWidget_3->removeRow(i);
	}

这种写法的问题:

  1. for循环的条件是i < 表行数,问题在于每次循环会移除一行,下次循环时表行数会减少,就会出现不能完全遍历的问题
  2. 循环体中每次循环会移除第i行,然而每次循环之后会移除前一行,那么后一行就会变成前一行,这样每次循环就变成了跳行移除

解决办法

  1. 正确写法1
    1. 先获取表的总行数,做为循环条件,保持循环次数不变
    2. 每次循环时,只删除起始行,前一行移除后下一行会自动移到前一行
	int rowCount = ui->tableWidget_3->rowCount();
	int start = 0;
	for (int i = start; i < rowCount; ++i)
	{
		ui->tableWidget_3->removeRow(start);
	}
  1. 正确写法2
    1. 从后往前遍历,因为行号的索引是从0开始的,所以i的起始值为表的行数减1
    2. 每次移除第i行 ,也就是从最后一行开始移除
	for (int i = ui->tableWidget_3->rowCount() - 1; i >= 0; --i)
	{
		ui->tableWidget_3->removeRow(i);
	}

其它

当然,如果你想删除所有行的话可以直接调用QTableWidgetvoid QTableWidget::setRowCount(int rows)函数,将参数直接设置为0,QTableWidget将会直接丢弃所有行

	ui->tableWidget_3->setRowCount(0);
posted on 2021-02-24 12:07  咸鱼Doyoung  阅读(1249)  评论(0编辑  收藏  举报