python - Mi QFileSystemModel no funciona como se esperaba en PyQt
(2)
EDIT2: model.hasChildren(parentIndex)
devuelve True
, pero model.rowCount(parentIndex)
devuelve 0
. ¿QFileSystemModel es solo fubar en PyQt?
EDITAR: con un poco de adaptación, todo funciona exactamente como debería si uso QDirModel. Esto está en desuso, pero tal vez QFileSystemModel no se haya implementado por completo en PyQt.
Estoy aprendiendo la arquitectura Qt Model / View en este momento, y he encontrado algo que no funciona como esperaba. Tengo el siguiente 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)
La pregunta:
¿Es esto un problema con PyQt, acabo de hacer algo mal o estoy malentendiendo completamente QFileSystemModel? De acuerdo con la documentación, model.rowCount(parentIndex)
debe devolver el número de hijos en el directorio actual. (Estoy ejecutando esto en Ubuntu con Python 2.6)
Los documentos QFileSystemModel dicen que necesita una instancia de una aplicación Gui, así que también coloqué el código anterior en un QWidget de la siguiente manera, pero con el mismo 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()
Como ya se ha dado cuenta, solo un par de pensamientos adicionales sobre lo que sucedía con su modelo: QFileSystemModel :: rowCount devuelve filas de la colección visibleChildren; Supongo que ha identificado correctamente el problema: en el momento en que está revisando el recuento de filas todavía no se ha rellenado. Cambié tu ejemplo sin usar temporizadores; Por favor, compruebe si funciona para usted:
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()
Creo que su código debería funcionar correctamente en cualquier evento de UI después de que el widget construido se muestre en la pantalla
Saludos
Lo he resuelto
La razón para utilizar QFileSystemModel en lugar de QDirModel es que QFileSystemModel carga los datos del sistema de archivos en un hilo separado. El problema con eso es que si intenta imprimir el número de hijos justo después de que se ha construido es porque aún no habrá cargado a los niños. La forma de corregir el código anterior es agregar lo siguiente:
self.timer = QtCore.QTimer(self)
self.timer.singleShot(1, self.printRowCount)
hasta el final del constructor, y agregue un método printRowCount que imprimirá la cantidad correcta de hijos. Uf.