2012-10-09 26 views
11

Tengo problemas para mostrar el ícono de una QAcción seleccionada del tema de icono actual. Hice la interfaz de usuario con el diseñador de Qt y la exporté con pyuic4 sample.ui > sample.py. Después de configurar el icono del tema con self.actionSample.setIcon(QtGui.QIcon.fromTheme(_fromUtf8("document-open"))), me sale el siguiente código fuente:QIcon.fromTheme no muestra ícono en 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_() 

Cuando ejecuto, la barra de herramientas no muestra el icono de 'documento abierto'. ¿Es un error o estoy haciendo algo mal?

Gracias

+0

¿En qué plataforma estás y qué versión de Qt estás usando? Además, ¿configuró el ícono en Designer, o lo agregó usted mismo manualmente? – ekhumoro

+0

@ekhumoro Me postulo: GNU/Linux 3.2.0-2-686 - Debian Testing/ Python 2.7.3rc2/ python-qt4 4.9.3-4/ I fijó el icono manualmente después de generar el ' archivo .py'. Pero cuando lo genero con qt-designer, es lo mismo. – Hypergraphe

+0

El cuadro de diálogo Nueva acción en el Editor de acciones debe mostrar el icono junto a la propiedad "Tema de iconos" si está disponible. – ekhumoro

Respuesta

11

El proceso de búsqueda icono utilizado por QIcon.fromTheme es algo complejo.

Los temas de iconos solo se admiten directamente en la plataforma X11 para los entornos de escritorio de GNOME y KDE. Para otras plataformas/escritorios, será necesario instalar un tema junto con la aplicación o ajustar el entorno del usuario de varias maneras.

Para encontrar el tema actual del sistema para GNOME, Qt consultará gconf (si el estilo gtk está disponible), y de lo contrario será el tema "gnome". Para KDE, Qt examinará el (los) archivo (s) de configuración kdeglobals, y de lo contrario usará de manera predeterminada "oxígeno" (o "crystalsvg" para versiones anteriores de KDE). Además, el tema "hicolor" siempre se puede utilizar como alternativa.

Una vez que se ha determinado el nombre del tema del sistema, Qt buscará el directorio que contiene los iconos en varios lugares predeterminados, que de nuevo dependen tanto de la plataforma como del escritorio que se esté utilizando. En X11, esto incluye $HOME/.icons y $XDG_DATA_DIRS/icons. La única ubicación común a todas las plataformas/escritorios es la ruta de recursos :/icons.

Los directorios de tema de icono deben incluir un archivo index.theme, que (entre otras cosas) especifica los subdirectorios que pueden contener iconos. Solo se utilizan archivos de iconos con una extensión png o svg.

La clase QIcon tiene algunos métodos estáticos que mostrarán exactamente donde Qt está buscando iconos temáticos:

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

Si no se visualiza el icono "-documento abierto", Qt está buscando, ya sea en el lugar "incorrecto", o el ícono falta por completo.

ACTUALIZACIÓN:

Como he dicho anteriormente: por defecto, Qt sólo es compatible con GNOME y KDE en la plataforma X11. No sabe nada sobre FluxBox WM, por lo que no puede detectar el tema del icono actual. Esto significa que recurrirá al uso de un tema minimalista "hicolor", que puede no tener todos los iconos necesarios.

Una forma de resolver este problema es crear un enlace simbólico "hicolor" que apunte al tema que desea utilizar. Idealmente, esto debería ir en la ubicación que está primero en la lista de rutas de búsqueda de Qt:

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

ACTUALIZACIÓN 2:

QT5 todavía sólo es compatible con KDE y GNOME por defecto, pero el Qt Platform Abstraction layer al menos marcas es posible crear plugins de tema personalizados (LXQT es un entorno de escritorio que aprovecha esto).También hay varios más DE que ahora se tratan como gtk/gnome: X-CINNAMON, UNITY, MATE, XFCE y LXDE.

+1

Estoy ejecutando FluxBox WM. Cuando ejecuto el fragmento de código anterior, me sale: '/home/ben/.icons/hicolor /usr/local/share/icons/hicolor /usr/share/icons/hicolor :/iconos/hicolor' Los iconos se encuentran en '/ usr/share/icons/hicolor' junto con index.theme, por lo que debería funcionar ¿no? – Hypergraphe

+1

Ok, cambié el tema con el método estático 'setThemeName' a uno en mis' .icons' y funcionó bien. ¿Alguna idea de por qué PyQt no busca en las otras rutas de búsqueda? – Hypergraphe

+1

Esa es una buena idea. Lo haré. Muchas gracias. – Hypergraphe