目的
实现一个基于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() self.files_list = [i for i in os.listdir(dir_path) if '.' in i] self.fileTreeModel.updataData(self.files_list)
|
结果展示
参考
[1] 【PyQt5】QTreeView使用自定义Model