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-行);
}
AFAIKsetRowCount(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)