【PyQt5】Model-View分类文件树

目的

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

实现代码

UI代码:

1
2
3
4
5
6
7
8
9
10
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的数据。相关代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# 更新模型数据
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为文件夹下所以文件名列表,获取代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
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)

结果展示

GIF 2022-11-17 23-39-49

参考

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