无法沿自定义 QSortFilterProxy 使用 QFileSystemModel

Unable to use QFileSystemModel along custom QSortFilterProxy

我是 qt 的新手,正试图在 QTreeView 中隐藏一些目录。我正在尝试使用名为 CacheFilterProxy.

的自定义 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 中,我尝试在树视图中提取当前所选项目的文件名和文件路径。文件名很容易检索,但检索文件路径会导致整个程序停止工作然后退出。

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)

这似乎是错误的。您的 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,因为它是索引而不是项目。乍一看有点乱。

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