PYQT文件路径转换为树形结构

3
我正在开发一个项目,需要在树形视图中显示一些文件夹。我有一个包含完整文件路径的列表,如下所示:
  • C:\folder1\file1
  • C:\folder1\folder11\file2
  • C:\folder2\file3
这些文件路径实际上是存储在SQL Server中的,我通过运行查询来获取它们。
我想找到一种方法将其放入QTreeView中。我尝试使用QFileSystemModel并使用setNameFilters,但这不起作用,因为您无法将路径输入到过滤器中。
有人建议使用QSortFilterProxyModel,但我不知道如何做到这一点。
谢谢。
汤姆。
1个回答

2

请看下面的示例,看是否适合您:

import sys
from PyQt4 import QtGui, QtCore

class TestSortFilterProxyModel(QtGui.QSortFilterProxyModel):
    def __init__(self, parent=None):
        super(TestSortFilterProxyModel, self).__init__(parent)
        self.filter = ['folder0/file0', 'folder1/file1'];

    def filterAcceptsRow(self, source_row, source_parent):
        index0 = self.sourceModel().index(source_row, 0, source_parent)
        filePath = self.sourceModel().filePath(index0) 

        for folder in self.filter:
            if filePath.startsWith(folder) or QtCore.QString(folder).startsWith(filePath):
                return True;        
        return False    

class MainForm(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MainForm, self).__init__(parent)

        model = QtGui.QFileSystemModel(self)
        model.setRootPath(QtCore.QDir.currentPath())

        proxy = TestSortFilterProxyModel(self)
        proxy.setSourceModel(model)     

        self.view = QtGui.QTreeView()
        self.view.setModel(proxy)

        self.setCentralWidget(self.view)

def main():
    app = QtGui.QApplication(sys.argv)
    form = MainForm()
    form.show()
    app.exec_()

if __name__ == '__main__':
    main()

希望这能帮助您,祝好!

谢谢您的回复,不幸的是,当我运行此程序时,只收到一个空的窗口小部件。当前路径是 “D:\Test”,在其中有两个文件夹 folder0 和 folder1,与您的过滤器相匹配的对应文件,但仍然没有任何结果。 - supertom44
这个编程示例在我的Ubuntu上运行良好,过滤模型中的逻辑相当基础,只是为了给你提供一个思路,以便继续完成你的任务。跟踪filterAcceptsRow方法并将其调整到符合你的过滤规则即可。 - serge_gubenko
我设法让它工作了,我意识到这是因为我没有使用完整的文件路径,一旦我重新阅读了文件并意识到它使用了“以...开头”,我意识到它需要完整的文件路径。谢谢。 - supertom44

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接