2016-05-25 3 views
0

Я новичок в qt и пытаюсь скрыть некоторые каталоги в QTreeView. Я пытаюсь скрыть некоторые папки на основе их имен, используя пользовательский QSortFilterProxy с именем CacheFilterProxy.Невозможно использовать QFileSystemModel вдоль настраиваемого QSortFilterProxy

Я настроить дерево просмотра таким образом:

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) 

, а затем, в self.selectedFileChanged я пытаюсь извлечь FileName и Filepath текущего пункта в дереве. Имя файла будет легко восстановлено, но получение пути к файлу приведет к прекращению работы всей программы и последующему завершению работы.

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) 

ответ

1

Это кажется неправильным. Ваш fileModel является источником, но я думаю, index является прокси-индексом. Я думаю, вы должны сопоставить его с исходной моделью, прежде чем использовать его в fileModel.

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) 

Обратите внимание, что я переименовал indexItem в sourceIndexCol0, как это показатель, а не вещь. На первый взгляд это было немного странно.

Я не смог проверить приведенный выше код. Если это не сработает, убедитесь, что индексы действительны перед их использованием и проверьте их класс модели.

+0

Ну, это казалось довольно очевидным, и я уже думал, что я это сделал (потому что я сделал то же самое в методе фильтрации), но некоторые, как я забыл это сделать. И неудивительно, что ранее было загружено имя файла. – Mehraban