Question

EDIT2: retours model.hasChildren(parentIndex) True, mais retourne model.rowCount(parentIndex) 0. QFileSystemModel est juste fubar dans PyQt?

EDIT: Avec un peu d'adaptation tout cela fonctionne exactement comme il se doit si j'utilise QDirModel. Ceci est dépréciée, mais peut-être QFileSystemModel n'a pas été pleinement mis en œuvre en PyQt?


J'apprends l'architecture Modèle Qt / Voir en ce moment, et je l'ai trouvé quelque chose qui ne fonctionne pas comme je m'y attendais pas à. J'ai le code suivant (adapté de Modèle Qt 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 question:

Est-ce un problème avec PyQt, ce que je viens faire quelque chose de mal, ou que je comprends mal complètement QFileSystemModel? Selon la documentation, model.rowCount(parentIndex) doit retourner le nombre d'enfants dans le répertoire courant. (Je suis en cela sous Ubuntu avec Python 2.6)

Les QFileSystemModel docs disent qu'il a besoin d'une instance d'une application Gui, donc je l'ai aussi placé le code ci-dessus dans un QWidget comme suit, mais avec le même résultat:

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()
Était-ce utile?

La solution

Je l'ai résolu.

La raison d'utiliser QFileSystemModel par opposition à QDirModel est parce que les charges QFileSystemModel les données à partir du système de fichiers dans un fil séparé. Le problème avec cela est que si vous essayez d'imprimer le nombre d'enfants juste après qu'il a été construit est qu'il n'aura pas chargé les enfants encore. La façon de fixer le code ci-dessus est d'ajouter ce qui suit:

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

à la fin du constructeur, et ajouter une méthode printRowCount qui imprimera le nombre exact d'enfants. Ouf.

Autres conseils

Puisque vous avez déjà deviné, juste quelques réflexions supplémentaires sur ce qui se passait avec votre modèle: QFileSystemModel :: renvoie rowCount lignes de la collection visibleChildren; Je suppose que vous avez correctement identifié le problème: au moment où vous vérifiez le nombre de lignes, il n'a pas encore été peuplée. J'ai changé votre exemple sans utiliser des minuteries; SVP, vérifiez si cela fonctionne pour vous:

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()

Je crois que votre code devrait fonctionner correctement sur un événement de l'interface utilisateur après un widget construit est affiché sur l'écran

ce qui a trait

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top