Ответ 1
Процесс поиска значков, используемый QIcon.fromTheme
, несколько сложный.
Темы значков поддерживаются непосредственно на платформе X11 для рабочих сред GNOME и KDE. Для других платформ/рабочих столов потребуется либо установить тему вместе с приложением, либо настроить пользовательскую среду различными способами.
Чтобы найти текущую системную тему для GNOME, Qt будет запрашивать gconf (если доступен стиль gtk), и в противном случае по умолчанию используется тема "gnome". Для KDE Qt рассмотрит файлы настроек kdeglobals
, а в ином случае по умолчанию - "кислород" (или "кристаллы" для более ранних версий KDE). Кроме того, тема "hicolor" всегда может использоваться как резерв.
Как только имя системной темы определено, Qt будет искать каталог, содержащий значки в разных заранее определенных местах, которые снова зависят от используемой платформы и рабочего стола. В X11 это включает $HOME/.icons
и $XDG_DATA_DIRS/icons
. Единственным местом, общим для всех платформ/настольных компьютеров, является путь ресурса :/icons
.
Каталоги каталогов тем должны включать файл index.theme
, который (среди прочего) определяет подкаталоги, которые могут содержать значки. Используются только файлы значков с расширением png
или svg
.
В классе 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 по крайней мере позволяет создавать настраиваемые плагины темы (LXQT - это одна среда рабочего стола, которая использует это). Есть еще несколько DE, которые теперь рассматриваются как gtk/gnome: X-CINNAMON, UNITY, MATE, XFCE и LXDE.