2012-10-09 103 views
11

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

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_() 

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

由于

+0

你在使用什么平台,以及你使用的是什么版本的Qt?此外,您是否在Designer中设置了该图标,或者手动添加了它? – ekhumoro

+0

@ekhumoro 我运行: 的GNU/Linux 3.2.0-2-686 - Debian的测试/ 的Python 2.7.3rc2/ 中的python-qt4的4.9.3-4/ 我生成后手动设置图标' .py'文件。但是当我用qt-designer生成它时,它是一样的。 – Hypergraphe

+0

动作编辑器中的新动作对话框应显示“图标主题”属性旁边的图标(如果可用)。 – ekhumoro

回答

11

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

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

要查找GNOME的当前系统主题,Qt将查询gconf(如果gtk样式可用),否则默认为“gnome”主题。对于KDE,Qt将检查kdeglobals设置文件,否则默认为“氧气”(或对于早期版本的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是无论是看在“错误”的地方,或者图标完全丢失。

UPDATE:

正如我上面所说的:在默认情况下,QT只支持GNOME和KDE的X11平台上。它不知道FluxBox WM的任何信息,因此无法检测到当前的图标主题。这意味着它会回落到使用最少的“hicolor”主题,它可能没有所有必需的图标。

解决此问题的一种方法是创建一个指向您要使用的主题的“hicolor”符号链接。理想情况下,应该在最初使用的搜索路径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。

+1

我正在运行FluxBox WM。当我执行上面的代码片段,我得到: '/home/ben/.icons/hicolor 在/ usr/local/share下/图标/高彩色 在/ usr /共享/图标/高彩色 :/图标/ hicolor' 图标与index.theme一起位于'/ usr/share/icons/hicolor'中,所以它应该正常工作? – Hypergraphe

+1

好的,我将'setThemeName'静态方法的主题更改为''.icons'中的一个,它运行良好。任何想法为什么PyQt不看其他搜索路径? – Hypergraphe

+1

这是一个好主意。我去做。非常感谢你。 – Hypergraphe