2012-10-09 6 views
11

Mam problem z wyświetlaniem ikony QAction wybranej z bieżącego motywu ikony. Zrobiłem ui z projektantem Qt i wyeksportowałem go za pomocą pyuic4 sample.ui > sample.py. Po ustawieniu ikony z motywu z self.actionSample.setIcon(QtGui.QIcon.fromTheme(_fromUtf8("document-open"))), mam następujący kod źródłowy:QIcon.fromTheme nie wyświetla ikony w 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_() 

Kiedy go wykonać, pasek narzędzi nie wyświetla ikonę „dokument-open”. Czy to błąd, czy robię coś nie tak?

Dzięki

+0

Co to jest plaform i jakiej wersji Qt używasz? Ponadto, ustawiłeś ikonę w Projektancie lub samodzielnie ją dodałeś? – ekhumoro

+0

@ekhumoro Używam: GNU/Linux 3.2.0-2-686 - Testowanie Debian/ Python 2.7.3rc2/ python-qt4 4.9.3-4/ skonfigurować ręcznie ikonę po wygenerowaniu ' .py' plik. Ale kiedy generuję go za pomocą qt-designer, to jest to samo. – Hypergraphe

+0

Okno dialogowe Nowa czynność w Edytorze akcji powinno wyświetlać ikonę obok właściwości "Motyw ikon", jeśli jest dostępna. – ekhumoro

Odpowiedz

11

Proces przeglądania ikona używany przez QIcon.fromTheme jest nieco skomplikowana.

Motywy ikon są obsługiwane bezpośrednio tylko na platformie X11 dla środowisk graficznych GNOME i KDE. W przypadku innych platform/komputerów stacjonarnych konieczne będzie albo zainstalowanie motywu razem z aplikacją, albo modyfikacja środowiska użytkownika na różne sposoby.

Aby znaleźć bieżącą motyw systemowy dla GNOME, Qt zapyta gconf (jeśli styl gtk jest dostępny), a poza tym domyślnie motyw "gnome". W przypadku KDE, Qt zbada pliki ustawień kdeglobals, a poza tym domyślnie "tlen" (lub "crystalsvg" dla wcześniejszych wersji KDE). Ponadto motyw "hicolor" zawsze może być użyty jako element zastępczy.

Po określeniu nazwy motywu systemowego Qt wyszuka katalog zawierający ikony w różnych wcześniej ustalonych miejscach, które również zależą od używanej platformy i pulpitu. Na X11 obejmuje to $HOME/.icons i $XDG_DATA_DIRS/icons. Jedyną lokalizacją wspólną dla wszystkich platform/stacji roboczych jest ścieżka dostępu :/icons.

Katalogi ikon z ikonami muszą zawierać plik index.theme, który (między innymi) określa podkatalogi, które mogą zawierać ikony. Używane są tylko pliki ikon z rozszerzeniem png lub svg.

Klasa QIcon ma kilka statycznych metod, które dokładnie pokażą, gdzie Qt jest szukających wrażeń ikon:

>>> 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 

Jeśli nie jest wyświetlana ikona „dokument-open”, Qt jest albo patrząc w "niewłaściwe" miejsce lub ikona zupełnie nie istnieje.

UPDATE:

Jak powiedziałem wyżej: domyślnie Qt obsługuje tylko GNOME i KDE na platformie X11. Nie wie nic o FluxBox WM, więc nie może wykryć aktualnego tematu ikon. Oznacza to, że powróci do używania minimalnego motywu "hicolor", który może nie mieć wszystkich wymaganych ikon.

Jednym ze sposobów rozwiązania tego problemu jest utworzenie "hicolor" dowiązania symbolicznego wskazującego motyw, którego chcesz użyć. Idealnie, powinno to iść w miejscu, które jest pierwszy na liście Qt ścieżek wyszukiwania:

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

UPDATE 2:

Qt5 nadal obsługuje tylko KDE i GNOME domyślnie, ale Qt Platform Abstraction layer przynajmniej czyni możliwe jest tworzenie własnych wtyczek tematycznych (LXQT to jedno środowisko graficzne, które korzysta z tego).Jest jeszcze kilka DE, które są teraz traktowane jako gtk/gnome: X-CINNAMON, UNITY, MATE, XFCE i LXDE.

+1

Używam FluxBox WM. Kiedy wykonać fragment kodu powyżej, otrzymuję: '/home/ben/.icons/hicolor /usr/local/share/icons/HiColor /usr/share/icons/HiColor :/icons/hicolor'pl Ikony znajdują się w '/ usr/share/icons/hicolor' razem z plikiem index.theme, więc powinno działać poprawnie? – Hypergraphe

+1

OK, zmieniłem motyw za pomocą statycznej metody 'setThemeName' na jedną w moim' .icons' i to działało dobrze. Any Idea dlaczego PyQt nie zagląda w inne ścieżki wyszukiwania? – Hypergraphe

+1

To dobry pomysł. Zrobię to. Dziękuję Ci bardzo. – Hypergraphe