Existe um bug no meu código para preencher um QTreeView?
Pergunta
Estou usando o PyQt 4.4.
É melhor mostrado usando algumas fotos.Todos os nós devem ter folhas de 0 a 99.Eles estão sendo carregados de forma incremental usando canFetchMore()
e fetchMore()
.Mas, por algum motivo desconhecido para mim, isso funciona apenas para o nó raiz.(Imagem 1)
Se eu recolher e expandir um nó, ele carregará 10 valores adicionais.(Imagens 2 e 3)
Também é estranho que carregue 10 valores, já que o código carrega apenas 5 por chamada para fetchMore()
, o que significa que é chamado 2 vezes antes que o código pare para carregar mais dados.
Eu escrevi um pequeno exemplo para demonstrar o problema, basta executá-lo com python test.py
.
http://snipt.org/lLh
Alguém sabe o que causa esse erro?
Solução
Dei uma olhada na fonte Qt (v4.5, embora não espere muita diferença entre v4.4 e v4.5) para QAbstractItemView e QTreeView, e não acho que eles suportem carregamento lento incremental de nós filhos.
QAbstractItemView não tem noção de árvores, então apenas chama fetchMore()
no índice mais alto.Ele chama fetchMore()
quando:
- A geometria é atualizada
- As barras de rolagem são movidas
- As linhas são inseridas
- O item atual é alterado como resultado de uma operação de arrastar e soltar de rolagem automática
QTreeView também chama fetchMore()
quando:
- Um item é expandido (esse é essencialmente o único momento em que ele chama
fetchMore()
com um índice não raiz) - O layout da visualização precisa ser reiniciado, como com
expandAll()
ecollapseAll()
Acho que a melhor solução seria subclassificar QTreeView para fazê-lo chamar fetchMore()
nos locais apropriados e com os índices apropriados.