Meu qfilesystemmodel não funciona como esperado em pyqt
-
27-09-2019 - |
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()
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