无法在自定义QSortFilterProxy中使用QFileSystemModel

时间:2016-05-25 05:41:14

标签: qt python-3.x pyqt qt4.8

我是qt的新手并试图隐藏QTreeView中的某些目录。我尝试使用名为QSortFilterProxy的自定义CacheFilterProxy根据名称隐藏某些文件夹。

我以这种方式设置树视图:

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 个答案:

答案 0 :(得分: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,因为它是索引而非项目。乍一看有点令人困惑。

我无法测试上面的代码。如果它不起作用,请在使用之前验证索引是否有效并检查其模型类。