无论文件如何,QFileIconProvider 返回相同的图标

Posted

技术标签:

【中文标题】无论文件如何,QFileIconProvider 返回相同的图标【英文标题】:QFileIconProvider returns the same icon regardless of file 【发布时间】:2015-02-19 10:09:53 【问题描述】:

我正在使用 PySide(包装 Qt 4.8 框架)开发一个应用程序。我需要显示与某些文件扩展名关联的应用程序图标,为此我使用QFileIconProvider。在 Windows 上,我的代码运行良好 - 每个文件扩展名都与相应应用程序的图标一起显示。但是,在 Linux Ubuntu (14.04.1) 上,对于我尝试的所有文件扩展名,相同的代码会显示未知文件扩展名的图标。

有人知道为什么会这样吗?代码如下:

from PySide import QtCore, QtGui

# Use the appropriate path module when running on Windows.
path = None
import os
if os.name == "nt":
    path = __import__("ntpath")
else:
    path = os.path


class MyWidget(QtGui.QWidget):
    def __init__(self, *args, **kwargs):
        # ...
        # ...
        self.file_ext_to_icon = 

    def get_icon(self, fpath):
        _, file_ext = path.splitext(fpath)
        file_ext = file_ext.replace(".", "")
        if file_ext in self.file_ext_to_icon:
            return self.file_ext_to_icon[file_ext]
        if path.exists(fpath):
            icon = QtGui.QFileIconProvider().icon(QtCore.QFileInfo(fpath))
        else:
            temp_fpath = path.join(os.getcwd(), "myappname_temp.%s" % file_ext)
            if not path.exists(temp_fpath):
                with open(temp_fpath, "wb") as _:
                    pass
            icon = QtGui.QFileIconProvider().icon(QtCore.QFileInfo(temp_fpath))
            os.remove(temp_fpath)
        if icon.isNull():
            # Use a custom default file icon from the resources file. Note that
            # this is different from the default file icon given by the OS.
            icon = QtGui.QIcon(":images/default_file_icon.png")
        self.file_ext_to_icon[file_ext] = icon
        return icon

【问题讨论】:

我也遇到了同样的问题。这是因为 Qt/Gtk 集成。 Qt 应用程序在 Gtk 桌面上不是“原生的”(在主题、图标、光标等方面)。例如,在 KDE 上问题应该会消失,因为 KDE 是基于 Qt 的。 【参考方案1】:

我遇到了同样的问题,经过大量挖掘后,我最终做了...

class IconProvider(QtWidgets.QFileIconProvider):
    def __init__(self):
        super().__init__()
        self.mimeDatabase = QtCore.QMimeDatabase()

    def icon(self, info: QtCore.QFileInfo):
        mimeType = self.mimeDatabase.mimeTypeForFile(info)
        return QtGui.QIcon.fromTheme(mimeType.iconName())


...used in my class
self.filesModel = QtWidgets.QFileSystemModel(self.filesView)
self.filesModel.setIconProvider(IconProvider())


...or in your case
icon = IconProvider().icon(QtCore.QFileInfo(fpath))

【讨论】:

这仅适用于 linux 对吗? @ManuelSchneid3r 除了 Linux,我没有尝试过其他任何东西。

以上是关于无论文件如何,QFileIconProvider 返回相同的图标的主要内容,如果未能解决你的问题,请参考以下文章

QT5获取系统文件图标,文件路径

如何在给定文件扩展名的情况下获取 Qt 图标(QIcon)

如何检查文件是不是存在(无论其文件类型如何)? [复制]

无论如何将两个gcov文件合并为一个

无论如何要在上传之前确定文件大小?

无论如何要在 ipad 上自动播放在线内容音频文件