2016-05-25 4 views
0

Ich bin neu in qt und versuche, einige Verzeichnisse in einer QTreeView zu verstecken. Ich versuche, einige Ordner basierend auf ihren Namen mit einem benutzerdefinierten QSortFilterProxy namens CacheFilterProxy zu verstecken.QFileSystemModel konnte nicht zusammen mit benutzerdefiniertem QSortFilterProxy verwendet werden

ich Setup sehen den Baum auf diese Weise:

fileModel = QtGui.QFileSystemModel() 
rootIndex = fileModel.setRootPath(rootDir) 
fileModel.setFilter(QtCore.QDir.Dirs | QtCore.QDir.NoDotAndDotDot) 
fileModel.setNameFilters([patternString]) 
model = CacheFilterProxy() 
model.setSourceModel(fileModel) 
self.fileTreeView.setModel(model) 
self.fileTreeView.setRootIndex(model.mapFromSource(rootIndex)) 
self.fileTreeView.clicked.connect(self.selectedFileChanged) 

und dann in self.selectedFileChanged ich versuche, Dateinamen und Dateipfad der aktuell ausgewählte Element in der Baumansicht zu extrahieren. Der Name der Datei wird leicht abgerufen, aber das Abrufen des Dateipfads führt dazu, dass das gesamte Programm nicht mehr funktioniert und dann beendet wird.

def selectedFileChanged(self, index): 
    fileModel = self.fileTreeView.model().sourceModel() 
    indexItem = self.fileTreeView.model().index(index.row(), 0, index.parent()) 
    # this works normal 
    fileName = fileModel.fileName(indexItem) 
    # this breaks the entire program 
    filePath = fileModel.filePath(indexItem) 

Antwort

1

Das scheint falsch. Ihre fileModel ist die Quelle, aber ich denke, index ist ein Proxy-Index. Ich denke, Sie müssen es dem Quellmodell zuordnen, bevor Sie es in der fileModel verwenden.

def selectedFileChanged(self, proxyIndex): 
    sourceModel = self.fileTreeView.model().sourceModel() 
    sourceIndex = self.fileTreeView.model().mapToSource(proxyIndex) 
    sourceIndexCol0 = sourceModel.index(sourceIndex.row(), 0, sourceIndex.parent()) 

    # this works normal 
    fileName = sourceModel.fileName(sourceIndexCol0) 
    # this breaks the entire program 
    filePath = sourceModel.filePath(sourceIndexCol0) 

Bitte beachte, dass ich indexItem-sourceIndexCol0 umbenannt, da es ein Index und kein Element ist. Es war auf den ersten Blick etwas verwirrend.

Ich konnte den obigen Code nicht testen. Wenn es nicht funktioniert, vergewissern Sie sich, dass die Indizes gültig sind, bevor Sie sie verwenden, und überprüfen Sie ihre Modellklasse.

+0

Nun, es schien ziemlich offensichtlich, und ich dachte bereits, dass ich es getan habe (weil ich das gleiche in der Filtermethode), aber einige, wie ich es vergessen habe, es zu tun. Und es ist überraschend, dass das Abrufen des Dateinamens zuvor funktioniert hat. – Mehraban

Verwandte Themen