【PyQt5】基于Model/View的文件分类树视图

目的

实现一个基于model/view的文件树。具体需求为:打开文件夹后,将文件夹目录下所有的文件归类到不同的父节点下,并通过信号槽机制实现自定义的双击文件事件。

实现代码

UI代码:

def create_fileTreeView(self):
    # 创建自定义文件树目录
    self.fileTreeModel = MyFileTreeModel()
    self.file_treeView = QtWidgets.QTreeView(self.fileTree_widget)
    self.file_treeView.setModel(self.fileTreeModel)
    self.file_treeView.header().setVisible(False)  # 隐藏表头标题
    self.file_treeView.doubleClicked.connect(self.file_tree_cilcked)
    # 将创建的窗口进行添加
    self.layout = QtWidgets.QHBoxLayout(self.fileTree_widget)
    self.layout.addWidget(self.file_treeView)

其中MyFileTreeModel类为自定义的Model类,具体细节参考文章:【PyQt5】QTreeView使用自定义Model。其中self.file_tree_cilcked为自定义的文件树文件双击信号对应的槽函数。

在MyFileTreeModel类中实现updataData()函数用于更新Model的数据。相关代码如下:

# 更新模型数据
def updataData(self, data):
    """
    模型数据构建,可修改拓展
    :param data: 数据源
    """
    self.beginResetModel()  # 模型重置开始
    # 废弃旧模型数据
    if self.rootItem:
        del self.rootItem
        self.rootItem = None

    rootData = ['FileType']
    self.rootItem = MyFileTreeItem(rootData)
    self._setupModelData(self.rootItem, data)
    self.endResetModel()  # 模型重置结束

# 构建模型数据
def _setupModelData(self, parent, data):
    """
    模型数据构建,可修改拓展
    :param parent: MyFileTreeItem,父节点
    :param data: 数据源
    """
    sorted_data = self._sortFiles(data)  # 文件分类
    father_data = ['STL几何模型', 'VTK文件', '应力场', '温度场', '杂项文件']  # 文件父节点,类别
    for data in father_data:
        primary = MyFileTreeItem([data], parent)
        parent.appendChild(primary)
        if len(sorted_data[data]) != 0:
            for ds in sorted_data[data]:
                primary.appendChild(MyFileTreeItem([ds], primary))

def _sortFiles(self, fileNames):
    """根据输入的文件名,按文件后缀名进行分类"""
    sorted_data = {'STL几何模型': [], 'VTK文件': [], '应力场': [], '温度场': [], '杂项文件': []}
    if len(fileNames) != 0:
        for fn in fileNames:
            suffix = os.path.splitext(fn)[1]  # 读取文件后缀名
            if suffix == '.stl' or suffix == '.STL':
                sorted_data['STL几何模型'].append(fn)
            elif suffix == '.vtk':
                sorted_data['VTK文件'].append(fn)
            elif suffix == '.xtem':
                sorted_data['温度场'].append(fn)
            else:
                sorted_data['杂项文件'].append(fn)
    return sorted_data

其中输入updataData()函数的参数data为文件夹下所以文件名列表,获取代码如下:

def folder_open(self):
    self.files_list = []  # 文件列表
    # 选择文件夹
    dir_path = QtWidgets.QFileDialog.getExistingDirectory(self, '打开文件夹', self.last_path)
    if dir_path:
        self.last_path = dir_path
        self.setting.setValue('LastFilePath', self.last_path)  # 保存当前目录的路径到配置文件中
        # 读取文件夹文件
        self.files_list.clear()
        # 去除子文件夹名 TODO: 判断方法有待优化
        self.files_list = [i for i in os.listdir(dir_path) if '.' in i]
        self.fileTreeModel.updataData(self.files_list)

结果展示

【PyQt5】基于Model/View的文件分类树视图_第1张图片

参考

[1] 【PyQt5】QTreeView使用自定义Model

你可能感兴趣的:(QT,qt,python,model/view)