【问题标题】:Is there a bug in my code for populating a QTreeView?我的代码中是否存在用于填充 QTreeView 的错误?
【发布时间】:2010-11-14 04:13:35
【问题描述】:

我正在使用 PyQt 4.4。

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

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

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

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

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

【问题讨论】:

    标签: qt pyqt qtreeview


    【解决方案1】:

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

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

    • 几何图形已更新
    • 滚动条被移动
    • 已插入行
    • 当前项目因自动滚动拖放操作而更改

    QTreeView 在以下情况下额外调用fetchMore()

    • 一个项目被展开(这实际上是它唯一一次使用非根索引调用fetchMore()
    • 视图的布局需要relay,比如expandAll()collapseAll()

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

    【讨论】:

    • 它确实支持它;你需要实现hasChildren(QModelIndex),所以视图不需要调用rowCount(QModelIndex)
    • 我现在遇到了确切的问题,QTreeview 不支持非顶级项目的惰性填充。有没有办法做到这一点?
    猜你喜欢
    • 1970-01-01
    • 2018-09-11
    • 2011-10-02
    • 2011-12-25
    • 2016-07-24
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多