Probleme mit QTreeView

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
midas
User
Beiträge: 7
Registriert: Mittwoch 16. Juli 2014, 06:56

Hallo,

ich will dass wenn ich in meiner QTreeView ein Index erweiter er mit alle Dateien ausgibt die kein Ordner ist. Das funktioniert auch nur leider immer erst beim zweiten Mal.
z.B.
- Verzeichnis
+Verzeichnis 2
Datei1
Datei2

Wenn ich auf das Verzeichnis "Verzeichnis" drücke soll er mir die Dateien 1 + 2 ausgeben. Drücke ich das erste mal drauf passiert nichts. Wiederhole ich den Vorgang gibt er mir die beiden Dateien richtig aus.
An was kann das liegen?

Code: Alles auswählen

from PyQt4 import QtGui
from PyQt4 import QtCore

class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        self.resize(600,400)

        self.treeview = QtGui.QTreeView(self)

        self.treeview.model = QtGui.QFileSystemModel()
        self.treeview.model.setRootPath( QtCore.QDir.currentPath() )
        self.treeview.setModel(self.treeview.model)
        self.treeview.setColumnWidth(0, 200)

        self.setCentralWidget(self.treeview)

        self.treeview.expanded.connect(self.on_treeview_expanded)


    def on_treeview_expanded(self, index):
        for i in xrange(self.treeview.model.rowCount(index)):

            indexItem = self.treeview.model.index(i,0, index)

            if not self.treeview.model.isDir(indexItem):
                fileName = self.treeview.model.fileName(indexItem)

                print fileName


if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())


BlackJack

Ist jetzt nur geraten, aber eventuell liegt es hier dran?
Qt Docs hat geschrieben:QFileSystemModel uses a separate thread to populate itself so it will not cause the main thread to hang as the file system is being queried. Calls to rowCount() will return 0 until the model populates a directory.
Edit: Und es gibt natürlich ein Signal auf den Objekten das einen Informieren kann wenn ein Verzeichnis in das Modell geladen wurde.
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

QFileSystemModel ist auch mit dem Signal expanded verbunden und liest im damit verbundenen Slot den Inhalt des Verzeichnisses ein. Dein MainWindow wird aber zuerst benachrichtigt, sadass beim 1. Klick noch gar nichts gelesen wurde. Du müsstest irgendwie dafür sorgen, dass Deine Methode on_treeview_expanded erst aufgerufen wird, nachdem QFileSystemModel das Signal bekommen hat.
a fool with a tool is still a fool, www.magben.de, YouTube
midas
User
Beiträge: 7
Registriert: Mittwoch 16. Juli 2014, 06:56

Vielen Dank für die Antworten. Das Problem habe ich nun glaube ich verstanden aber einen wirklichen Lösungsansatz fällt mir nun auch nicht ein
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Du könntest in on_treeview_expanded(self, index) die eigentliche Aktion mit QTimer.singleShot aufrufen.
a fool with a tool is still a fool, www.magben.de, YouTube
Antworten