QTreeView甚至为不可见的项调用QAbstractItemModel :: hasChildren()

时间:2017-01-09 20:44:04

标签: performance qt pyqt pyside qabstractitemmodel

我有一个包含许多项目的自定义树模型。它在顶层以下的第一级有超过1000000项。当我在QTreeView中展开此级别时,即使项目不可见,也会为每个项目调用model.hasChildren()(您需要向下,向下,向下滚动...以使其可见) 。问题是我的函数hasChildren()需要一些时间,特别是在被调用了几百万次(大约需要10秒 - 在PySide / PyQt中)。我的问题是:

1)我知道hasChildren()被称为可见项,因为它必须知道该项是否应该是可扩展的(如果它有子项)。但为什么它被称为隐形物品(我的意思是那些不在可见范围内并且只有在向下滚动后才可见)?在我看来,只有当项目即将变得可见时才应该调用它。我错过了一些吗?

2)如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

您可能需要按pyqt docs覆盖fetchMore / canFetchMore。基本上当你展开根时,会调用fetchMore(),你只会返回一个数据项的子集;当用户滚动时,视图将询问root是否可以获取更多内容;如果它回答是,则会调用fetchMore()并且您的模型可以返回更多项目。这应该导致仅在提取的树项上调用hasChildren()。