不显示图标

does not show icons

我刚刚安装了 Python3 (3.5.2) 和 Pyqt5 (5.8.2),我正在按照本教程学习和制作 GUI:http://zetcode.com/gui/pyqt5/firstprograms/

我正在尝试 运行 第二个示例,但程序返回错误(这也发生在第一个示例中,但由于它没有图像,我没有注意到)如下:

QApplication: invalid style override passed, ignoring it.
No XVisualInfo for format QSurfaceFormat(version 2.0, options QFlags<QSurfaceFormat::FormatOption>(), depthBufferSize -1, redBufferSize 1, greenBufferSize 1, blueBufferSize 1, alphaBufferSize -1, stencilBufferSize -1, samples -1, swapBehavior QSurfaceFormat::SwapBehavior(SingleBuffer), swapInterval 1, profile  QSurfaceFormat::OpenGLContextProfile(NoProfile))
Falling back to using screens root_visual.

这是什么意思?我是不是少了一些包裹?

我先用这个命令安装了pyqt:

sudo -H pip3 install PyQt5

但是 Python3 没有承认它的存在所以我搜索了 apt ubuntu 存储库并安装了:

sudo apt install python3-PyQt5

我还尝试通过完整路径 /foo/bar/image.png 引用图像,但什么也没有

有什么问题?

编辑#1

我使用的代码来自示例 2:

#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
ZetCode PyQt5 tutorial

This example shows an icon
in the titlebar of the window.

author: Jan Bodnar
website: zetcode.com
last edited: January 2015
"""

import sys
import os
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QIcon

base_dir = os.path.dirname(os.path.abspath(__file__))
os.chdir(base_dir)

class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):

        self.setGeometry(300, 300, 300, 220)
        self.setWindowTitle('Icon')
        self.setWindowIcon(QIcon('image.png'))

        self.show()


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

在您 post 之后,我重新安装了所有软件包。错误略有不同,但结果是一样的:

python3 example_02.py 
QApplication: invalid style override passed, ignoring it.

屏幕截图:

所以首先,您的代码没有错误。这更像是警告,但又不是。下面这行告诉你什么

QApplication: invalid style override passed, ignoring it

是您的样式选项无效。如果这是一个错误,您的脚本根本不会 运行。

我马上看到的是,您永远不会提供图像的路径。

现在,如果图像与脚本位于同一根目录中,那么它应该可以识别没有路径的图像。但是,如果你试图做我认为你正在做的事情,那无论如何都行不通。我认为您正在尝试创建一个启动器图标和一个标题栏图标,这通常是相辅相成的。

在我看来,您已将它作为某种形式的资源文件添加到 Atom 中。在这种情况下,大多数 Ide 会为该文件创建一个路径。有时是路径,有时是本地 url。当与 QT 创建者一起工作时,QT 本身就可以做到这两点。

我从未使用过 Atom,所以无法告诉您它是如何工作的。

我能说的就是这些。您使用的是 Linux,这意味着 .ico 文件没有用。我之前告诉过你 linux 处理图标文件的方式与 windows 不同。这很可能是您的问题。

所以我建议你看看这个 https://askubuntu.com/questions/476981/how-do-i-make-a-desktop-icon-to-launch-a-program

读完之后,如果需要,请看一下这个https://help.ubuntu.com/community/UnityLaunchersAndDesktopFiles#Using_a_text_editor

这两个 link 都解释了如何为您的程序创建启动器图标。

下面link将说明如何在您的程序中设置菜单栏(标题栏)的图标。 PyQt4 set windows taskbar icon

希望对您有所帮助!

请注意,所有应用程序都没有图标,不仅仅是 PyQt 图标示例。这是因为默认情况下,某些环境会关闭标题栏中的图标。你必须启用它们。

例如在Xfce桌面环境中,我们可以使用xfce4-settings-editor工具。在 Settings/Settings 编辑器 select xfwm4 中。 找到 show_app_icon 选项并检查它。来回更改主题以查看更改;它们不会立即可见。

在此之后,您将在 PyQt5 示例的标题栏中看到该图标。

至于警告;这是最近发生的事情,它必须做点什么 Qt 和 GTK 主题之间的不兼容。我还没发现 到目前为止删除警告的解决方案。

我向提出这个问题的作者学习了PyQt5,我也遇到了图标无法显示的问题,我尝试了一些方法来解决它,这就是我所做的,希望它有效!

首先,请务必使用图标的绝对路径,例如:

self.setWindowIcon(QIcon("F:/Workspace/PyQT5-Study/images/web.png"))

但这不是一个好主意,所以你可以使用第二种方式:

from PyQt5.QtCore import QFileInfo
# ...
def initUI(self):
    # ...
    root = QFileInfo(__file__).absolutePath()
    self.setWindowIcon(QIcon(root+'/images/web.png'))
    # or
    # import os
    # current_dir = os.path.dirname(os.path.realpath(__file__))
    # self.setWindowIcon(QIcon(os.path.join(current_dir, 'images/web.png')))
    # ...

最后,如果你的图标也不能显示,你应该检查这个图标,如果它是合法的图标

简而言之,普通图片无限多,可以存储很多图片,可以轻松转换,但是图标有一定的大小,颜色种类,更重要的是,图标有透明度,也就是说你可以看到背景,他们有框架(不总是直的)。所以你可以使用网络在线工具来转换你的图像然后再试一次,这对我很有帮助!

另外你应该检查图标的源格式,确保你永远不会改变它,比如 .jpg 到 .png 等。这会产生问题! 希望你能解决问题![​​=12=]

我遇到了完全相同的问题。

要事第一。 QWidget或QMainWindow类下其实并没有setWindowIcon()方法。您应该尝试在应用程序级别设置 QIcon,如下所示。

app = QApplication(sys.argv)
app.setWindowIcon(QtGui.QIcon('home.png'))

其次,使用此代码创建的图标不会反映在 window 的标题上,而是会反映为应用程序图标,如下图所示。 home.png

Ubuntu 中的“应用程序图标”,而不是 Window 标题上的“图标”

最后,路径无所谓,可以是绝对路径也可以是相对路径,系统会考虑。

在 windows 上确保使用真实的 .ico 文件和完整路径

iconpath = os.path.join(os.getcwd(),'qtlearning','assets','python.ico')  
self.setWindowIcon(QIcon(iconpath))

我只是提供了图标的完整路径,就这么简单