python - QIcon.fromTheme 在 PyQt 中不显示图标

标签 python pyqt icons pyqt4 qt-designer

我无法显示从当前图标主题中选择的 QAction 图标。我用 Qt 设计器制作了 ui,并用 pyuic4 sample.ui > sample.py 导出了它。使用 self.actionSample.setIcon(QtGui.QIcon.fromTheme(_fromUtf8("document-open"))) 从主题设置图标后,我得到以下源代码:

from PyQt4 import QtCore, QtGui
import sys

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(800, 600)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtGui.QStatusBar(MainWindow)
        self.statusbar.setObjectName(_fromUtf8("statusbar"))
        MainWindow.setStatusBar(self.statusbar)
        self.toolBar = QtGui.QToolBar(MainWindow)
        self.toolBar.setObjectName(_fromUtf8("toolBar"))
        MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar)
        self.actionSample = QtGui.QAction(MainWindow)
        self.actionSample.setObjectName(_fromUtf8("actionSample"))
        self.actionSample.setIcon(QtGui.QIcon.fromTheme(_fromUtf8("document-open")))
        self.toolBar.addAction(self.actionSample)

        QtCore.QMetaObject.connectSlotsByName(MainWindow)

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    window = QtGui.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(window)
    window.show()
    app.exec_()

当我执行它时,工具栏不显示图标“文档打开”。是错误还是我做错了什么?

谢谢

最佳答案

QIcon.fromTheme 使用的图标查找过程有些复杂。

图标主题仅在 GNOME 和 KDE 桌面环境的 X11 平台上直接受支持。对于其他平台/桌面,有必要在安装应用程序的同时安装主题,或者以各种方式调整用户环境。

要查找 GNOME 的当前系统主题,Qt 将查询 gconf(如果 gtk 样式可用),否则默认为“gnome”主题。对于 KDE,Qt 将检查 kdeglobals 设置文件,否则默认为“oxygen”(或早期版本的 KDE 的“crystalsvg”)。此外,“hicolor”主题始终可以用作后备。

一旦确定了系统主题名称,Qt 将在各种预先确定的位置查找包含图标的目录,这同样取决于所使用的平台和桌面。在 X11 上,这包括 $HOME/.icons$XDG_DATA_DIRS/icons。所有平台/桌面唯一通用的位置是资源路径 :/icons

图标主题目录必须包含一个 index.theme 文件,该文件(除其他事项外)指定可以包含图标的子目录。仅使用具有 pngsvg 扩展名的图标文件。

QIcon 类有一些静态方法可以准确显示 Qt 在哪里寻找主题图标:

>>> from PyQt4 import QtGui
>>> app = QtGui.QApplication([])
>>> for path in QtGui.QIcon.themeSearchPaths():
...     print "%s/%s" % (path, QtGui.QIcon.themeName())
... 
/home/ekhumoro/.icons/hicolor
/usr/local/share/icons/hicolor
/usr/share/icons/hicolor
:/icons/hicolor

如果“文档打开”图标没有显示,Qt 要么在“错误”的地方查找,要么图标完全丢失。

更新:

正如我上面所说:默认情况下,Qt 在 X11 平台上只支持 GNOME 和 KDE。它对 FluxBox WM 一无所知,因此无法检测到当前图标主题。这意味着它将退回到使用最小的“hicolor”主题,该主题可能没有所有必需的图标。

解决此问题的一种方法是创建指向您要使用的主题的“hicolor”符号链接(symbolic link)。理想情况下,这应该位于 Qt 搜索路径列表中的第一个位置:

$ ln -s icon/theme/directory $HOME/.icons/hicolor

更新 2:

Qt5 仍然默认只支持 kde 和 gnome,但是 Qt Platform Abstraction layer至少可以创建自定义主题插件(LXQT 是一个利用此优势的桌面环境)。还有几个 DE 现在被视为 gtk/gnome:X-CINNAMON、UNITY、MATE、XFCE 和 LXDE。

关于python - QIcon.fromTheme 在 PyQt 中不显示图标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12805036/

相关文章:

python - wxPython 创建图像工具栏唯一窗口

Python:编写两个词典的理解

python - 以下解决方案的时间复杂度是 O(N) 吗?

python - PyQt5:如何单击按钮开始绘画?

python - 如何为代理模型处理的模型中的多个列设置项目委托(delegate)?

java - 背景与 getResourceAsStream ("path")

c++ - 如何设置c++应用程序窗口的图标和任务栏的图标?

windows - 如何通过命令行更改现有文件夹的图标? ( Windows 10)

python - C 和 Python 之间共享变量

python - 立即在 QStyledItemDelegate 中弹出 QCompleter,无需文本输入