QTableview - ResizeToContents查询每一行吗?

3 投票
1 回答
959 浏览
提问于 2025-04-18 14:05

下午好,

我正在使用QTableView和QAbstractTableModel来显示大量数据(超过2万行),每一行都有不同长度的文本,包括换行符,这些文本是通过自定义的代理来显示的。这些数据存储在内存中(没有数据库、流或类似的东西),并可能会在表格外部被更改。为了让行高适应文本的变化,我把表格的垂直标题的调整模式设置为“根据内容调整”,这样就能正确使用我代理的大小提示来设置行高。

这个方法效果不错,但根据表格的大小,性能却很糟糕(加载一个大表格需要几分钟)。一旦我关闭了调整模式,加载速度就快得像闪电一样,但当然行高就不对了(导致带有换行的文本重叠等问题)。看起来在使用自动调整模式时,每个单元格的大小提示都会被查询,这花费了很多时间(我在代理的大小提示函数中打印调试信息确认了这一点)。

我想知道“根据内容调整”模式是否就是这样设计的,因为我本以为只需要查询表格中实际可见的行,而不是所有行(根据rowCounts()的调用)。由于任何时候只显示一部分行,这样做当然会显著提高性能。这是调整代码中的一个bug或不足,还是我对这个功能理解错了?顺便说一下,我使用的是PyQt 4.10,也许在新版本中这个行为发生了变化?

提前感谢所有的建议。

1 个回答

1

如果你把 verticalHeader.sizeHint 设置为 ResizeToContents,那么每次更新行的时候,整个表格都会被处理一次,以获取新的列宽。这种行为对我们大多数人来说非常重要,尤其是当我们没有一个经常更新的大表格时。

首先,不要使用 resizeToContents 这个大小提示!

基本的解决办法是:给列设置固定的大小,并使用拉伸选项。(我觉得这可能不适合你)

我用的解决办法是:我设置了一个定时器,每隔2秒调用一次 resizeColumnsToContents() 的功能。

优化的解决办法:你可以根据你的情况来优化我的解决办法。比如,你可以等所有行的数据都更新完再去调用调整大小的功能。

对于你提到的建议(只调整可见项的大小):这个方法并不太有用。

撰写回答