我学习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)
我不确定我是否会回答您的问题,但我发现我无法在评论中回复我的内容。 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)
这可能不是最好的方法,但对我有用。
更新
好吧,我不知道你为什么需要它,但我设法实现了你的目标。这是我的做法。
<RCC version="1.0">
<qresource>
<file>img.png</file>
</qresource>
</RCC>
/usr/lib/qt6/rcc -g python -o test_resources.py test.qrc
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 上使用应用程序图标做出奇怪的事情,并且如果主窗口没有主菜单,默认情况下图标不可见)
遇到同样的问题。但注意到我没有为我的项目创建 python 环境,一旦我这样做了,图标就会按预期显示(无需我更改任何代码)。 不确定您是否已经这样做了。另外,我使用了 miniconda/anaconda 环境和 python 3.11.6。 希望有帮助。