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()
¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top