Y a-t-il un bug dans mon code pour remplir un QTreeview?
Question
J'utilise PYQT 4.4.
Il est mieux montré en utilisant des images. Tous les nœuds doivent avoir des feuilles de 0 à 99. Ils sont chargés de manière incrémentielle en utilisant canFetchMore()
et fetchMore()
. Mais pour une raison quelconque, inconnu pour moi, cela ne fonctionne que pour le nœud racine. (Image 1)
Si je m'effondre et développer un nœud, il charge 10 valeurs supplémentaires. (Photo 2 et 3)
Il est également étrange, qu'il charge 10 valeurs, car le code ne charge que 5 par appel à fetchMore()
, ce qui signifie que cela est appelé 2 fois avant que le code ne s'arrête pour charger plus de données.
J'ai écrit un petit exemple pour démontrer le problème, il suffit de l'exécuter avec python test.py
.
http://snipt.org/llh
Quelqu'un sait-il ce qui cause cette erreur?
La solution
J'ai jeté un coup d'œil à la source QT (v4.5, bien que je ne m'attende pas à beaucoup de différence entre V4.4 et V4.5) pour QabStractItemView et QTreeView, et je ne pense pas qu'ils prennent en charge le chargement paresseux incrémentiel des nœuds enfants.
QabStractItemView n'a pas de notion d'arbres, donc il n'appelle que fetchMore()
sur le plus grand index. Il appelle fetchMore()
lorsque:
- La géométrie est mise à jour
- Les barres de défilement sont déplacées
- Les lignes sont insérées
- L'élément actuel est modifié à la suite d'une opération de glisser-déposer automatiquement
QTreeView appelle en plus fetchMore()
lorsque:
- Un élément est élargi (c'est essentiellement la seule fois qu'il appelle
fetchMore()
avec un index non racine) - La disposition de la vue doit être rejetée, comme avec
expandAll()
etcollapseAll()
Je pense que la meilleure solution serait de sous-classe QTreeview pour l'appeler fetchMore()
Dans les endroits appropriés et avec les indices appropriés.