2012-10-09 11 views
11

Ich habe Probleme, das Symbol einer QAction anzuzeigen, die aus dem aktuellen Icon-Thema ausgewählt wurde. Ich habe das UI mit Qt Designer gemacht und es mit pyuic4 sample.ui > sample.py exportiert. das Symbol aus dem Thema mit self.actionSample.setIcon(QtGui.QIcon.fromTheme(_fromUtf8("document-open"))) Nach der Einstellung, erhalte ich den folgenden Quellcode:QIcon.fromTheme zeigt kein Symbol in 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_() 

Wenn ich es ausführen, wird die Symbolleiste auf das Symbol nicht angezeigt werden ‚Dokument zu öffnen.‘ Ist es ein Fehler oder mache ich etwas falsch?

Dank

+0

Welche Plattform sind Sie und welche Version von Qt verwenden Sie? Haben Sie das Symbol in Designer festgelegt oder manuell hinzugefügt? – ekhumoro

+0

@ekhumoro Ich arbeite mit: Gnu/Linux 3.2.0-2-686 - Debian Testing/ Python 2.7.3rc2/ python-qt4 4.9.3-4/ ich manuell das Symbol einrichten nach dem Generieren der ' .py' Datei. Aber wenn ich es mit qt-Designer erzeuge, ist es dasselbe. – Hypergraphe

+0

Das Dialogfeld "Neue Aktion" im Aktionseditor sollte das Symbol neben der Eigenschaft "Symboldesign" anzeigen, sofern es verfügbar ist. – ekhumoro

Antwort

11

Der Prozess Symbol Nachschlagen von QIcon.fromTheme verwendet wird, ist etwas komplexer.

Symbolthemen werden nur direkt auf der X11-Plattform für die GNOME- und KDE-Desktopumgebungen unterstützt. Für andere Plattformen/Desktops muss entweder ein Design zusammen mit der Anwendung installiert oder die Umgebung des Benutzers auf verschiedene Arten optimiert werden.

Um das aktuelle Systemthema für GNOME zu finden, fragt Qt gconf ab (wenn der gtk-Stil verfügbar ist), ansonsten das "gnome" -Thema. Für KDE wird Qt die kdeglobals Einstellungsdatei (en) untersuchen und ansonsten auf "sauerstoff" (oder "crystalsvg" für frühere Versionen von KDE) zurückgreifen. Darüber hinaus kann das Thema "Hicolor" immer als Fallback verwendet werden.

Sobald der Name des Systemdesigns festgelegt wurde, sucht Qt nach dem Verzeichnis mit den Symbolen an verschiedenen vordefinierten Orten, die wiederum von der verwendeten Plattform und dem verwendeten Desktop abhängen. In X11 sind dies $HOME/.icons und $XDG_DATA_DIRS/icons. Der einzige Speicherort, der allen Plattformen/Desktops gemeinsam ist, ist der Ressourcenpfad :/icons.

Symboldesignverzeichnisse müssen eine index.theme Datei enthalten, die (unter anderem) die Unterverzeichnisse angibt, die Symbole enthalten können. Es werden nur Symboldateien mit der Erweiterung png oder svg verwendet.

Die QIcon Klasse einige statische Methoden hat, die genau zeigt, wo Qt für Themen-Symbole suchen:

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

Wenn die „Dokument-open“ Symbol nicht angezeigt wird, wird Qt entweder suchen in der "falscher" Ort, oder das Symbol fehlt insgesamt.

UPDATE:

Wie oben gesagt: standardmäßig nur Qt unterstützt GNOME und KDE auf der X11-Plattform. Es weiß nichts über FluxBox WM und kann daher das aktuelle Symbolthema nicht erkennen. Dies bedeutet, dass auf ein minimales "Hicolor" -Thema zurückgegriffen wird, das möglicherweise nicht alle erforderlichen Symbole enthält.

Eine Möglichkeit, dieses Problem zu lösen, besteht darin, einen "hicolor" Symlink zu erstellen, der auf das gewünschte Thema verweist. Im Idealfall sollte dies in den Ort gehen, die zuerst in Qt-Liste der Suchpfade ist:

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

UPDATE 2:

QT5 immer noch nur KDE und GNOME standardmäßig unterstützt, aber die Qt Platform Abstraction layer mindestens Fabrikate Es ist möglich, benutzerdefinierte Themen-Plugins zu erstellen (LXQT ist eine Desktop-Umgebung, die davon profitiert).Es gibt auch mehrere weitere DEs, die jetzt als gtk/gnome behandelt werden: X-CINNAMON, UNITY, MATE, XFCE und LXDE.

+1

Ich betreibe FluxBox WM. Als ich das Code-Fragment oben auszuführen, erhalte ich: '/home/ben/.icons/hicolor /usr/local/share/icons/hicolor /usr/share/icons/hicolor :/icons/hicolor Icons befinden sich in '/ usr/share/icons/hicolor' zusammen mit dem index.theme, also sollte es richtig funktionieren? – Hypergraphe

+1

Ok, ich habe das Thema mit der statischen Methode 'setThemeName' in eins in' .icons' geändert und es hat gut funktioniert. Irgendeine Idee, warum PyQt nicht in die anderen Suchpfade schaut? – Hypergraphe

+1

Das ist eine gute Idee. Ich werde das machen. Vielen Dank. – Hypergraphe