使用QTreeView显示指定目录中的文件,并自定义Header

这次研究了QTreeView的用法,于是想使用QTreeView显示制定目录下的所有子目录和文件。过程中,遇到了几个问题,在此记录一下同时分享给大家,如有不妥之处,还请批评指正:

  1. 设置根目录后,仍然会展示系统中所有的目录,如下图所示:
    使用QTreeView显示指定目录中的文件,并自定义Header_第1张图片
    针对此问题,解决方法比较简单,只需要给QTreeView同时设置RootPath和RootIndex即可
self._home = "F:/FileProtect/"
self.filemodel.setRootPath(self._home)
self.treeView.setModel(self.filemodel)
self.treeView.setRootIndex(self.filemodel.index(self._home))
  1. 使用QStandardItemModel获取文件目录后,QTreeView的Header显示的是英文表头,如图所示:
    使用QTreeView显示指定目录中的文件,并自定义Header_第2张图片
    针对此问题,做了多重尝试,均已失败告终
    首先考虑在QFileSystemModel修改headData,结果该方法不生效
self.filemodel.setHeaderData(0, Qt.Horizontal, '文件名', 0)
self.filemodel.setHeaderData(1, Qt.Horizontal, '大小', 0)
self.filemodel.setHeaderData(2, Qt.Horizontal, '文件类型', 0)
self.filemodel.setHeaderData(3, Qt.Horizontal, '修改时间', 0)

最后找到了一种方法,感觉繁琐,但是有效。如果哪位朋友有更好的方法,还请分享一下。下边介绍我这里的方法
首先获取QTreeView的header,然后创建一个QStandardItemModel,并只设置headerData,然后将header的Model设置为QStandardItemModel。这里有个需要注意的点就是: 设置header的Model一定要在给QTreeView设置Model之后

完整代码如下:

 self._home = "F:/FileProtect/"
 self.filemodel = QFileSystemModel()
 self.filemodel.setFilter(QtCore.QDir.Dirs | QtCore.QDir.Files | QtCore.QDir.NoDotAndDotDot)
 self.filemodel.setRootPath(self._home)
 self.treeView.setModel(self.filemodel) # 设置QTreeView的Model
 
 self.headerModel = QStandardItemModel()
 self.headerModel.setColumnCount(4)  # 设置model的列数
 self.headerModel.setHeaderData(0, Qt.Horizontal, '文件名', 0)
 self.headerModel.setHeaderData(1, Qt.Horizontal, '大小', 0)
 self.headerModel.setHeaderData(2, Qt.Horizontal, '文件类型', 0)
 self.headerModel.setHeaderData(3, Qt.Horizontal, '修改时间', 0)
 header = self.treeView.header()
 header.setModel(self.headerModel) # 设置QTreeView#Header的Model
 self.treeView.setRootIndex(self.filemodel.index(self._home)) # 设置RootIndex

最后运行效果如下:
使用QTreeView显示指定目录中的文件,并自定义Header_第3张图片

你可能感兴趣的:(Python,PyQT5.0,python,pyqt)