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

问题描述:

我正在使用PyQt 4.4。在我的代码中填充QTreeView是否存在一个错误?

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

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

这也是奇怪,它加载10个值,因为代码加载只有5%调用fetchMore(),意味着这个被调用2倍的代码将停止加载更多的数据之前。

Screenshot 1 http://i27.tinypic.com/ezyic.png Screenshot 2 http://i32.tinypic.com/2ymunpx.png Screenshot 3 http://i27.tinypic.com/283zfr.png

我写了一个小例子来说明这个问题,只是python test.py运行它。 http://snipt.org/lLh

有谁知道是什么原因导致了这个错误?

我查看了Qt源代码(v4.5,虽然我不认为v4.4和v4.5有太大区别),但对于QAbstractItemView和QTreeView,我不认为它们支持增量式延迟加载的子节点。

QAbstractItemView没有树的概念,所以它只在最上面的索引上调用fetchMore()。它要求fetchMore()时:

  • 几何更新
  • 滚动条移动
  • 行插入
  • 目前的项目变更为自动滚动阻力&拖放操作的结果

QTreeView另外拨打fetchMore()时:

  • 的项目扩展(这是本质上它与非根索引调用fetchMore()唯一一次)
  • 视图的布局需要进行重新铺设,如用expandAll()collapseAll()

我觉得最好的解决方案是继承QTreeView,使其在适当的位置和相应的索引中调用fetchMore()

+0

它确实支持它;你需要实现`hasChildren(QModelIndex)`,所以视图不需要调用`rowCount(QModelIndex)`。 – 2009-07-26 20:14:13