Frage

EDIT2: model.hasChildren(parentIndex) kehrt True, aber model.rowCount(parentIndex) kehrt 0. Ist QFileSystemModel nur fubar in PyQt?

EDIT: Mit ein wenig Anpassung dies alles genau funktioniert, wie es sollte, wenn ich QDirModel verwenden. Dies ist veraltet, aber vielleicht QFileSystemModel nicht in PyQt vollständig umgesetzt worden?


Ich lerne die Qt Model / View-Architektur im Moment, und ich habe etwas gefunden, das nicht funktioniert, wie ich erwarten würde es. Ich habe den folgenden Code bekommt (angepasst von Qt Modellklassen ):

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)

Die Frage:

Ist das ein Problem mit PyQt, habe ich nur etwas falsch gemacht, oder bin ich Missverständnis völlig QFileSystemModel? Gemäß der Dokumentation, model.rowCount(parentIndex) sollte die Anzahl der Kinder im aktuellen Verzeichnis zurückzukehren. (Ich bin das unter Ubuntu mit Python laufe 2.6)

Die QFileSystemModel docs sagen, dass es eine Instanz einer GUI-Anwendung benötigt, so dass ich auch den obigen Code in einem QWidget platziert habe wie folgt, aber mit dem gleichen Ergebnis:

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()
War es hilfreich?

Lösung

Ich habe es gelöst.

Der Grund QFileSystemModel zu verwenden, wie zum QDirModel Gegensatz ist, weil QFileSystemModel lädt die Daten aus dem Dateisystem in einem separaten Thread. Das Problem dabei ist, dass, wenn Sie versuchen, die Anzahl der Kinder zu bedrucken, nachdem es konstruiert worden ist, dass es nicht die Kinder noch geladen haben wird. Die Art und Weise des obigen Code zu beheben, ist die folgende hinzuzufügen:

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

bis zum Ende des Konstrukteurs, und fügen Sie eine printRowCount Methode, die die korrekte Anzahl der Kinder gedruckt wird. Puh.

Andere Tipps

Da haben Sie es schon herausgefunden, nur ein paar zusätzliche Gedanken auf, was los war mit Ihrem Modell: QFileSystemModel :: rowCount kehrt Zeilen aus der visibleChildren Sammlung; Ich denke, du bist richtig das Problem erkannt: zu der Zeit, wenn Sie Reihe sind die Überprüfung zählen es war noch nicht besiedelt. Ich habe Ihr Beispiel geändert, ohne Timer verwendet wird; pls, zu überprüfen, ob es funktioniert für Sie:

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

Ich glaube, Ihr Code sollte korrekt auf jedem UI-Ereignisse arbeitet nach Widget auf dem Bildschirm gezeigt aufgebaut

Bezug

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top