2009-07-26 26 views
3

我正在使用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

有誰知道是什麼原因導致了這個錯誤?

回答

6

我查看了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