Pergunta

Edit2: model.hasChildren(parentIndex) retorna True, mas model.rowCount(parentIndex) retorna 0. O qfilesystemModel é apenas Fubar em Pyqt?

EDITAR: Com um pouco de adaptação, tudo isso funciona exatamente como deveria se eu usar o QDirmodel. Isso está depreciado, mas talvez o QfilesystemModel não tenha sido totalmente implementado no PYQT?


Estou aprendendo o modelo QT/visualizar arquitetura no momento e encontrei algo que não funciona como eu esperava. Eu tenho o seguinte código (adaptado de QT Model Classes):

from PyQt4 import QtCore, QtGui

model = QtGui.QFileSystemModel()

parentIndex = model.index(QtCore.QDir.currentPath())
print model.isDir(parentIndex) #prints True
print model.data(parentIndex).toString() #prints name of current directory

rows = model.rowCount(parentIndex)
print rows #prints 0 (even though the current directory has directory and file children)

A questão:

Isso é um problema com o PYQT, acabei de fazer algo errado ou estou completamente entendendo mal o QFilesystemModel? De acordo com a documentação, model.rowCount(parentIndex) deve devolver o número de crianças no diretório atual. (Estou executando isso no Ubuntu com o Python 2.6)

O QFilesystemModel Docs diz que precisa de uma instância de um aplicativo da GUI, por isso também coloquei o código acima em um Qwidget da seguinte maneira, mas com o mesmo resultado:

import sys
from PyQt4 import QtCore, QtGui

class Widget(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)

        model = QtGui.QFileSystemModel()

        parentIndex = model.index(QtCore.QDir.currentPath())
        print model.isDir(parentIndex)
        print model.data(parentIndex).toString()

        rows = model.rowCount(parentIndex)
        print rows


def main():
    app = QtGui.QApplication(sys.argv)
    widget = Widget()
    widget.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()
Foi útil?

Solução

Eu resolvi isso.

O motivo para usar o QFilesystemModel em oposição ao QDirmodel é porque o QFilesystemModel carrega os dados do sistema de arquivos em um encadeamento separado. O problema é que, se você tentar imprimir o número de crianças logo após a construção, é que ele ainda não terá carregado as crianças. A maneira de corrigir o código acima é adicionar o seguinte:

self.timer = QtCore.QTimer(self)
self.timer.singleShot(1, self.printRowCount)

até o final do construtor e adicione um método PrintrowCount que imprimirá o número correto de crianças. Ufa.

Outras dicas

Como você já descobriu, apenas alguns pensamentos extras sobre o que estava acontecendo com seu modelo: QFILESYSTEMMODEL :: RowCount retorna linhas da coleção VisibleChildren; Acho que você está corretamente identificado o problema: no momento em que você está verificando a contagem de linhas, ainda não estava preenchida. Mudei seu exemplo sem usar temporizadores; Por favor, verifique se funciona para você:

class Widget(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)

        self.model = QtGui.QFileSystemModel()
        self.model.setRootPath(QtCore.QDir.currentPath())

    def checkParent(self):
        parentIndex = self.model.index(QtCore.QDir.currentPath())      

        print self.model.isDir(parentIndex)
        print self.model.data(parentIndex).toString()

        rows = self.model.rowCount(parentIndex)
        print "row count:", rows

def main():
    app = QtGui.QApplication(sys.argv)
    widget = Widget()
    widget.show()
    app.processEvents(QtCore.QEventLoop.AllEvents)  
    widget.checkParent()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

Eu acredito que seu código deve funcionar corretamente em qualquer evento da interface do usuário após a construção do widget é mostrado na tela

Saudações

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top