这次研究了QTreeView的用法,于是想使用QTreeView显示制定目录下的所有子目录和文件。过程中,遇到了几个问题,在此记录一下同时分享给大家,如有不妥之处,还请批评指正:
- 设置根目录后,仍然会展示系统中所有的目录,如下图所示:
针对此问题,解决方法比较简单,只需要给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))
- 使用QStandardItemModel获取文件目录后,QTreeView的Header显示的是英文表头,如图所示:
针对此问题,做了多重尝试,均已失败告终
首先考虑在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
最后运行效果如下: