Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python QIcon.fromTheme未在PyQt中显示图标_Python_Pyqt_Icons_Pyqt4_Qt Designer - Fatal编程技术网

Python QIcon.fromTheme未在PyQt中显示图标

Python QIcon.fromTheme未在PyQt中显示图标,python,pyqt,icons,pyqt4,qt-designer,Python,Pyqt,Icons,Pyqt4,Qt Designer,我无法显示从当前图标主题中选择的QAction的图标。我用Qt设计器创建了ui,并用pyuic4-sample.ui>sample.py导出了它。使用self.actionSample.setIcon(QtGui.QIcon.fromTheme(_fromUtf8(“文档打开”)))设置主题图标后,我得到了以下源代码: from PyQt4 import QtCore, QtGui import sys try: _fromUtf8 = QtCore.QString.fromUtf8

我无法显示从当前图标主题中选择的QAction的图标。我用Qt设计器创建了ui,并用
pyuic4-sample.ui>sample.py
导出了它。使用
self.actionSample.setIcon(QtGui.QIcon.fromTheme(_fromUtf8(“文档打开”)))
设置主题图标后,我得到了以下源代码:

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_()
执行时,工具栏不显示“文档打开”图标。是虫子还是我做错了什么


感谢QIcon使用的图标查找过程。fromTheme有点复杂

对于GNOME和KDE桌面环境,X11平台仅直接支持图标主题。对于其他平台/台式机,需要在应用程序中安装主题,或者以各种方式调整用户环境

要查找GNOME的当前系统主题,Qt将查询gconf(如果gtk样式可用),否则默认为“GNOME”主题。对于KDE,Qt将检查
kdeglobals
设置文件,否则默认为“oxygen”(对于早期版本的KDE,则为“crystalssvg”)。此外,“hicolor”主题始终可以用作备用方案

一旦确定了系统主题名称,Qt将在各种预先确定的位置查找包含图标的目录,这同样取决于所使用的平台和桌面。在X11上,这包括
$HOME/.icons
$XDG\u DATA\u 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
如果没有显示“document open”(文档打开)图标,则表明Qt的位置“错误”,或者该图标完全丢失

更新:

如上所述:默认情况下,Qt只支持X11平台上的GNOME和KDE。它对FluxBox WM一无所知,因此无法检测当前图标主题。这意味着它将退回到使用最小的“hicolor”主题,它可能没有所有必需的图标

解决这个问题的一种方法是创建一个“hicolor”符号链接,指向您想要使用的主题。理想情况下,这应该位于Qt搜索路径列表中的第一个位置:

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


默认情况下,Qt5仍然只支持kde和gnome,但至少使创建自定义主题插件成为可能(这是一个利用这一点的桌面环境)。还有其他几个DE现在被视为gtk/gnome:X-肉桂、UNITY、MATE、XFCE和LXDE。

您使用的是什么平台,您使用的是什么版本的Qt?另外,您是在Designer中设置了图标,还是自己手动添加的?@ekhumro我正在运行:Gnu/Linux 3.2.0-2-686-Debian Testing/Python 2.7.3rc2/Python-qt4 4.9.3-4/I在生成
.py
文件后手动设置图标。但是,当我使用qt designer生成它时,它是相同的。动作编辑器中的新动作对话框应该在“图标主题”属性旁边显示图标(如果可用)。当我打开动作编辑器时,我在“图标主题”文本编辑中写入了“文档打开”。但我没有看到任何图标。我正在运行FluxBox WM。当我执行上面的代码片段时,我得到:
/home/ben/.icons/hicolor/usr/local/share/icons/hicolor/usr/share/icons/hicolor:/icons/hicolor
图标与index.theme一起位于
/usr/share/icons/hicolor
中,所以它应该可以正常工作吗,我用
setThemeName
静态方法将主题更改为我的
.icons
中的主题,效果很好。知道PyQt为什么不查看其他搜索路径吗?