使用pyside6构建的应用程序主窗口图标不显示

问题描述 投票:0回答:2

我学习Python已经4个月了。开始使用 qtcreator 和 pyside 6 开发一个简单的应用程序。主窗口已初始化并启动,但在尝试将图标设置到主窗口时卡住了。尝试了许多不同的选择 - 没有任何效果。我在Windows10上工作,所有项目文件都是UTF-8编码的。 PNG 图像不会直接显示或通过 .qrc 文件显示。当前版本的代码如下:

import sys

from PySide6.QtGui import QIcon, QPixmap, Qt
from PySide6.QtWidgets import QApplication, QMainWindow, QWidget
import resources

from ui_mainwindow import UiKonDiphone

class MainWindow(QMainWindow, QWidget):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.ui = UiKonDiphone()
        self.ui.setupUi(self)
        icon = QIcon()
        icon.addPixmap(QPixmap(u":/icon/icons/main_icon_24.png"))
        self.setWindowIcon(icon)
        return
if __name__ == '__main__':

    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()

    sys.exit(app.exec_())

.qrc 文件如下所示:

<RCC>
    <qresource prefix="/icons">
        <file>icon/main_icon_24.png</file>
        <file>icon/pause_icon_98.png</file>
        <file>icon/record_icon_98.png</file>
    </qresource>
</RCC>

最初用“self.setWindowIcon(QIcon())”编写,但什么也没做。 尝试直接从 qt 创建者添加图标。 还有:

class UiKonDiphone(object):
    KonDiphone.setToolButtonStyle(Qt.ToolButtonFollowStyle)
        icon = QIcon()
        icon.addFile(u":/icons/icon/main_icon_24.png", QSize(), QIcon.Normal, QIcon.Off)
        KonDiphone.setProperty("Main_Icon", icon)
python icons pyside6 qpixmap qicon
2个回答
0
投票

我不确定我是否会回答您的问题,但我发现我无法在评论中回复我的内容。 IE。它实际上是我们在评论中讨论的这一部分的答案 - “资源未附加到应用程序”到底是什么意思?
我可以用另一个问题来回答它——为什么你想使用资源? IE。我对这个主题的理解 - 资源作为二进制预编译应用程序的一部分出现。例如,当您有 C/C++ 代码时,您可能希望在 GUI 中拥有一些图标/字符串。这些是资源,您希望将其与应用程序一起提供。因此,您将它们放入 rcc 文件中,链接器将其与您的代码一起打包成一个可执行二进制文件。
但 python 是一个不同的故事 - 这里没有编译阶段,因为它是一种解释性语言。因此,您没有一个固定的二进制文件,而是存储在某些目录中的一堆文件。这些文件之一将是您创建的资源文件。但您需要告诉您的应用程序如何连接到此资源。对于上面的 C/C++ 示例 - 这是一个链接器工作来进行此绑定。但对于 python,我假设您需要在某个地方提供此资源文件的路径(或者将此文件放在 resources 库可以找到它的正确位置)。 这就提出了下一个问题 - 如果您需要提供这条路径,那么为什么不直接将其提供给 QIcon() 构造函数?

这是我如何做的一个例子。 在我的 main_window.py 中我有:

from my.helpers import load_icon
...
   self.setWindowIcon(load_icon("app.png"))

辅助函数是这样的:

def get_app_path() -> str:
    return os.path.dirname(os.path.dirname(os.path.realpath(__file__))) + os.sep

def load_icon(icon_name: str) -> QIcon:
    return QIcon(get_app_path() + os.sep + icon_name)

这可能不是最好的方法,但对我有用。

更新
好吧,我不知道你为什么需要它,但我设法实现了你的目标。这是我的做法。

  1. 我在img.png
  2. 中拍摄了图标图像
  3. 然后我准备了这样的资源文件:
<RCC version="1.0">
  <qresource>
    <file>img.png</file>
  </qresource>
</RCC>
  1. 资源在
  2. 的帮助下被编译成python文件
/usr/lib/qt6/rcc -g python -o test_resources.py test.qrc
  1. 然后我运行代码:
from PySide6.QtGui import QIcon
from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton
import test_resources

class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.button = QPushButton(self, icon= QIcon(":/img.png"))

app = QApplication()
window = MainWindow()
window.show()
app.exec()

它对我有用,并在我的按钮上显示 img.png 的图标。
(我使用按钮而不是主窗口图标,因为 gnome 在我的 Linux 上使用应用程序图标做出奇怪的事情,并且如果主窗口没有主菜单,默认情况下图标不可见)


0
投票

遇到同样的问题。但注意到我没有为我的项目创建 python 环境,一旦我这样做了,图标就会按预期显示(无需我更改任何代码)。 不确定您是否已经这样做了。另外,我使用了 miniconda/anaconda 环境和 python 3.11.6。 希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.