编码:
populateTable()
{
tableWidget->clearContents();
tableWidget->setRowCount(stringList.size());
for(int i = 0; i < stringList.size(); ++i)
{
tableWidget->setItem(i, 0, new QTableWidgetItem(stringList.at(i)));
}
}
问题:
第一次运行 populateTable() 时,一切都很好。但是接下来的时间,它的运行速度明显比以前慢。
讨论:
经过仔细测试,我怀疑 clearContents() 是问题所在。因为只需将代码从
tableWidget->clearContents();
至:
tableWidget->setRowCount(0);
解决了问题,但现在又出现了另一个问题;将行数设置为“0”似乎不会删除堆分配的 QTableWidgetItems,它似乎只是留下了项目的所有权,所以它留下了内存泄漏。(或者至少我只是这么认为......)
QTableWidget 中的 Qt 文档相当模糊,所以我不完全知道 clearContents() 的实际作用。在文档中,它说“从视图中删除所有不在标题中的项目”,这让我问,表格的内容是否只是隐藏?它会被删除吗?我不太确定。我的理论是 clearContents() 仅隐藏项目,并且任何下一次填充表的尝试实际上都会删除并删除每个项目,然后分配一个新项目以在表上设置,这反过来又是一项昂贵的操作。
另一个有趣的事情是 Qt 在 QTableWidget 上的文档建议填充 QTableWidget 的正确方法是在堆上分配一个 QTableWidgetItem 然后使用 setItem() 将它设置在一个表格单元格上,就像我在上面的代码中呈现的那样,我发现它是奇怪...
总之:
是否有另一种方法来填充和重新填充 Qt 表而不会出现所有这些问题?如果没有,有没有办法解决这些问题?