在Python PyQt6中,为什么我的QTreeView显示白色图标而不是QStandardItemModel中的文件夹图标?

t9aqgxwy  于 2022-12-15  发布在  Python
关注(0)|答案(1)|浏览(87)

我正在尝试为目录中的文件夹项目添加文件夹图标,沿着关联文件类型的图标。

iconProvider = QFileIconProvider()

        for item in os.listdir(path):
            QItem = QStandardItem(item)
            file_item_icon = iconProvider.icon(QFileInfo(item))
            QItem.setIcon(file_item_icon)
            root_item.appendRow(QItem)

文件夹显示为白色图标时的QTreeView

我试过使用QFileSystemModel,它确实正确地显示了图标,但是,我需要QStandardItemModel提供的控件...
图标工作的QTreeView

ecfsfe2w

ecfsfe2w1#

如果用于构造QFileInfo示例的路径不是绝对路径,则只能使用相对路径。
QFileInfo可以指向一个具有相对或绝对文件路径的文件。绝对文件路径以目录分隔符“/”开始(或在Windows上以驱动器规格开头)。相对文件名以目录名或文件名开头,并指定相对于当前工作目录的路径**。
[着重号是我的]
os.listdir()仅返回 * 名称 *:
返回一个列表,其中包含path指定的目录中的条目名称。
这意味着QFileInfo将只有基于 * 工作目录 * 的每个条目的“相对”名称。
这显然是您的问题:

  • 由于您可能使用了一个与工作目录不直接相关的路径,因此它将是一个无效路径,因此图标提供程序将使用默认(通常为“新文档”)图标;
  • 巧合的是,如果os.listdir()返回的路径与工作目录的现有名称一致,它甚至可能提供 wrong 图标:假设你在工作目录下有一个something.doc文件,os.listdir()返回的文件名也是something.doc,它会有前一个文件的图标,即使后一个文件实际上是一个目录;

因此,解决方案是使用绝对路径 * 或 * 适当的图标类型。
对于简单的情况(当图标类型已知时),您可以使用icon(IconType)覆盖,使用提供的枚举。例如,如果您 do 知道路径指向一个目录(即os.path.isdir()):

file_item_icon = iconProvider.icon(iconProvider.IconType.Folder)

否则,您应该使用完整路径,以便QFileInfo将使用 * 真实的 * 文件引用:

baseDir = QDir(path)
for fileName in os.listdir(path):
    info = QFileInfo(baseDir.absoluteFilePath(fileName))
    icon = iconProvider.icon(info)
    root_item.appendRow(QStandardItem(icon, fileName))

相关问题