Mi QFileSystemModel no funciona como se esperaba en PyQt
-
27-09-2019 - |
Pregunta
Edit2: model.hasChildren(parentIndex)
vuelve True
, pero vuelve model.rowCount(parentIndex)
0
. QFileSystemModel es simplemente fubar en PyQt?
EDIT: Con un poco de adaptación Todo esto funciona exactamente como debe ser si uso QDirModel. Esto está en desuso, pero tal vez QFileSystemModel no se ha aplicado plenamente en PyQt?
Estoy aprendiendo la arquitectura Modelo Qt / Ver en el momento, y he encontrado algo que no funciona como yo esperaría que lo haga. Tengo el siguiente código (adaptado de Qt Modelo ):
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, han acabo hecho algo mal, o estoy completamente malentendido QFileSystemModel? Según la documentación, model.rowCount(parentIndex)
debería devolver el número de niños en el directorio actual. (Me estoy quedando esta bajo Ubuntu con Python 2.6)
Los documentos QFileSystemModel dicen que necesita una instancia de una aplicación GUI, así que también he colocado 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()
Solución
He resolvió.
La razón para utilizar QFileSystemModel en contraposición a QDirModel es porque QFileSystemModel carga los datos del sistema de ficheros en un hilo separado. El problema con esto es que si se intenta imprimir el número de niños sólo después de que ha sido construido es que no va a haber cargado los niños todavía. La manera de solucionar el código anterior es añadir lo siguiente:
self.timer = QtCore.QTimer(self)
self.timer.singleShot(1, self.printRowCount)
al final del constructor, y añadir un método printRowCount que imprimirá el número correcto de los niños. Uf.
Otros consejos
Como ya ha descubierto a cabo, sólo un par de reflexiones adicionales sobre lo que estaba pasando con su modelo: QFileSystemModel :: rowCount devuelve filas de la colección visibleChildren; Supongo que está identificado correctamente el problema: en el momento cuando se esté examinando el número de filas que aún no se ha llenado. He cambiado tu ejemplo y sin el uso de temporizadores; pls, cheque 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 el código debe funcionar correctamente en cualquier caso la interfaz de usuario después de widget de construcción se muestra en la pantalla
lo que respecta ??p>