我是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)
答案 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
,因为它是索引而非项目。乍一看有点令人困惑。
我无法测试上面的代码。如果它不起作用,请在使用之前验证索引是否有效并检查其模型类。