下午好,
我正在使用QTableview + QAbstractTableModel来显示潜在的大量数据(20k +行),每行由包含各种长度文本的单元格组成,包括使用自定义委托显示的换行符。数据驻留在内存中(没有数据库,流或类似),可能会从表外部更改。为了使行高适应文本的更改,我将TableView的垂直标题的调整模式设置为“ResizeToContents”,它正确地使用我的委托的sizeHint来设置高度。
这很好用,但是根据表的大小,性能很差(加载大表几分钟)。一旦我关闭调整大小模式,加载速度与闪电一样快,但当然行高不正确(导致带有换行的文本重叠行等)。似乎在使用自动调整大小模式时,会查询每一行中的每个单元格的大小提示,这需要花费大量时间(通过在我的委托的sizeHint函数中打印调试消息来确认)。
我想知道这是否是ResizeToContents模式的预期行为,因为我认为只需要查询TableView的实际可见行 - 而不是所有行(由rowCounts()调用给出)。由于在任何时候只显示一小部分行,这当然会显着改善性能。这是调整大小代码中的错误/缺点还是我误解了有关此功能的一些内容?顺便说一下,我正在使用PyQt 4.10,所以这个行为可能在较新的版本中有所改变?
提前感谢所有提示。
答案 0 :(得分:0)
如果您将verticalHeader.sizeHint
设置为ResizeToContents,则会在任何行更新所有表以处理新列宽。如果我们没有经常更新的大表,这种行为对我们大多数人来说都是节省生命的。
首先,不要使用resizeToContents
大小提示!
基本解决方案:对具有拉伸选项的列使用固定大小。 (我想,这不适合你)
解决方案,我使用:我有定时器以2秒的间隔呼叫resizeColumnsToContents()
插槽。
解决方案,优化:您可以针对您的案例优化我的解决方案。例如,您可以等到所有行数据更新后调用resize slot。
回答你的建议(仅针对可见项目调整大小):它没用。