2012-10-09 105 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