我的代码中是否存在填充QTreeView的错误?

时间:2009-07-26 17:02:33

标签: qt pyqt qtreeview

我正在使用PyQt 4.4。

最好使用一些图片显示。所有节点都应具有从0到99的叶子。它们使用canFetchMore()fetchMore()进行增量加载。但由于某些原因我不知道这只适用于根节点。 (图1)

如果我折叠并展开一个节点,它会加载额外的10个值。 (图2和3)

同样奇怪的是,它加载了10个值,因为每次调用fetchMore()时代码只加载5个,这意味着在代码停止加载更多数据之前会调用2次。

Screenshot 1 Screenshot 2 Screenshot 3

我写了一个小例子来演示问题,只需用python test.py运行它。 http://snipt.org/lLh

有谁知道导致此错误的原因是什么?

1 个答案:

答案 0 :(得分:6)

我看了Qt源代码(v4.5,虽然我不希望v4.4和v4.5之间存在太大差异),但QAbstractItemView和QTreeView并不认为它们支持增量延迟加载子节点。

QAbstractItemView没有树的概念,所以它只在最顶层的索引上调用fetchMore()。它在以下时间调用fetchMore()

  • 更新几何
  • 移动滚动条
  • 插入行
  • 当前项目因自动滚动拖动而改变。放弃操作

QTreeView还会在以下时间调用fetchMore()

  • 项目已展开(这实际上是唯一一次使用非根索引调用fetchMore()
  • 视图的布局需要重新设置,例如使用expandAll()collapseAll()

我认为最好的解决方案是将QTreeView子类化,使其在适当的位置调用fetchMore()并使用适当的索引。