在我的代码中填充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()
。
它确实支持它;你需要实现`hasChildren(QModelIndex)`,所以视图不需要调用`rowCount(QModelIndex)`。 – 2009-07-26 20:14:13