下午好,

我正在使用QTableview + QAbstractTableModel来显示潜在的大量数据(20k +行),每行包含使用自定义委托显示的包含各种长度的文本(包括换行符)的单元格。数据驻留在内存中(没有数据库,流或类似数据),并且可以从表外部进行更改。为了使行高适应文本的变化,我将TableView的垂直标题的“调整大小模式”设置为“ ResizeToContents”,该模式正确地使用了委托人的sizeHint来设置高度。

这一切都很好,但是根据表的大小,性能却很糟糕(加载大型表需要几分钟)。一旦我关闭了调整大小模式,加载速度就快如闪电,但是行高当然是不正确的(导致带有换行符的文本与行重叠,等等)。似乎在使用自动调整大小模式时,会查询每行中的每个单元格的大小提示,这会花费很多时间(通过在我的委托的sizeHint函数中打印调试消息来确认)。

我想知道这是否是ResizeToContents模式的预期行为,因为我假设只需要查询TableView的实际可见行,而不是查询所有行(由rowCounts()调用给出)。由于任何一次仅显示一小部分行,因此这无疑会显着提高性能。这是调整大小代码中的错误/缺陷,还是我误解了有关此功能的某些信息?顺便说一句,我正在使用PyQt 4.10,所以也许这种行为在新版本中有所改变?

预先感谢所有提示。

最佳答案

如果将verticalHeader.sizeHint设置为ResizeToContents,则在任何行更新时,将处理ALL表以获得新的列宽。如果我们没有经常更新的大表,那么这种行为对于我们大多数人来说就是救命稻草。

首先,不要使用resizeToContents大小提示!
基本解决方案:对具有拉伸选项的列使用固定大小。 (我认为,这不适合你)
解决方案,我使用:我有计时器以2秒的间隔调用resizeColumnsToContents()插槽。
优化的解决方案:您可以针对自己的情况优化我的解决方案。例如,您可以等到所有行数据更新到调用调整大小插槽。

回答您的建议(仅调整可见项目的大小):这没有用。

关于python - QTableview-ResizeToContents查询每一行吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24864255/

10-10 12:46