如何更正 QTreeView 上的 "expand/collapse" 图标?
How to correct the "expand/collapse" icon on the QTreeView?
当你看到这个展开图标的时候,你会认为文件夹下面有东西。但什么也没有。此问题会导致糟糕的用户体验。如何解决? (** 如果文件夹为空,则不会显示展开图标。)
我的代码基本上是这样的:
QFileSystemModel ---> QTreeView
edit3:
import sys
from PySide2.QtCore import *
from PySide2.QtWidgets import *
libPath = 'f:/tmp22'
# RUN ------------------------------------------------------------------
if __name__ == '__main__':
app = QApplication(sys.argv)
# data model ----------------------------------------------------------
treeModel = QFileSystemModel()
treeModel.setFilter(QDir.NoDotAndDotDot | QDir.Dirs)
treeModel.setRootPath(libPath)
# setup ui -------------------------------------------------------------
treeView = QTreeView()
treeView.setModel(treeModel)
treeView.setRootIndex(treeModel.index(libPath))
# show ui -------------------------------------------------------------
treeView.show()
sys.exit(app.exec_())
文件夹结构:
F:/tmp22
F:/tmp22/folder1 <-------- empty!
F:/tmp22/_folder2 <-------- empty!
QFileSystemModel 似乎认为一个文件夹总是有子文件夹,因此在这种情况下 hasChildren() returns 为 True。要更正此问题,如果文件夹不符合过滤器,则必须通过返回 false 来覆盖此方法。
import sys
# PySide2
from PySide2.QtCore import QDir, QSortFilterProxyModel
from PySide2.QtWidgets import QApplication, QFileSystemModel, QTreeView
libPath = 'f:/tmp22'
class FileSystemModel(QFileSystemModel):
def hasChildren(self, parent):
file_info = self.fileInfo(parent)
_dir = QDir(file_info.absoluteFilePath())
return bool(_dir.entryList(self.filter()))
# RUN ------------------------------------------------------------------
if __name__ == "__main__":
app = QApplication(sys.argv)
# data model ----------------------------------------------------------
treeModel = FileSystemModel()
treeModel.setFilter(QDir.NoDotAndDotDot | QDir.Dirs)
treeModel.setRootPath(libPath)
# setup ui -------------------------------------------------------------
treeView = QTreeView()
treeView.setModel(treeModel)
treeView.setRootIndex(treeModel.index(libPath))
# show ui -------------------------------------------------------------
treeView.show()
sys.exit(app.exec_())
当你看到这个展开图标的时候,你会认为文件夹下面有东西。但什么也没有。此问题会导致糟糕的用户体验。如何解决? (** 如果文件夹为空,则不会显示展开图标。)
我的代码基本上是这样的:
QFileSystemModel ---> QTreeView
edit3:
import sys
from PySide2.QtCore import *
from PySide2.QtWidgets import *
libPath = 'f:/tmp22'
# RUN ------------------------------------------------------------------
if __name__ == '__main__':
app = QApplication(sys.argv)
# data model ----------------------------------------------------------
treeModel = QFileSystemModel()
treeModel.setFilter(QDir.NoDotAndDotDot | QDir.Dirs)
treeModel.setRootPath(libPath)
# setup ui -------------------------------------------------------------
treeView = QTreeView()
treeView.setModel(treeModel)
treeView.setRootIndex(treeModel.index(libPath))
# show ui -------------------------------------------------------------
treeView.show()
sys.exit(app.exec_())
文件夹结构:
F:/tmp22
F:/tmp22/folder1 <-------- empty!
F:/tmp22/_folder2 <-------- empty!
QFileSystemModel 似乎认为一个文件夹总是有子文件夹,因此在这种情况下 hasChildren() returns 为 True。要更正此问题,如果文件夹不符合过滤器,则必须通过返回 false 来覆盖此方法。
import sys
# PySide2
from PySide2.QtCore import QDir, QSortFilterProxyModel
from PySide2.QtWidgets import QApplication, QFileSystemModel, QTreeView
libPath = 'f:/tmp22'
class FileSystemModel(QFileSystemModel):
def hasChildren(self, parent):
file_info = self.fileInfo(parent)
_dir = QDir(file_info.absoluteFilePath())
return bool(_dir.entryList(self.filter()))
# RUN ------------------------------------------------------------------
if __name__ == "__main__":
app = QApplication(sys.argv)
# data model ----------------------------------------------------------
treeModel = FileSystemModel()
treeModel.setFilter(QDir.NoDotAndDotDot | QDir.Dirs)
treeModel.setRootPath(libPath)
# setup ui -------------------------------------------------------------
treeView = QTreeView()
treeView.setModel(treeModel)
treeView.setRootIndex(treeModel.index(libPath))
# show ui -------------------------------------------------------------
treeView.show()
sys.exit(app.exec_())