使用 Pyside6 缺少主窗口图标

Posted

技术标签:

【中文标题】使用 Pyside6 缺少主窗口图标【英文标题】:Main Window icon missing using Pyside6 【发布时间】:2022-01-10 16:14:58 【问题描述】:

我可能遗漏了一些明显的东西,但以下代码似乎没有在窗口标题栏中显示 app_icon。 app_icon.png 是一个 24x24px 的文件,与 main.py 和 ui_mainwindow.py 位于同一文件夹中。 Qt docs 似乎暗示 PySide6.QtGui.QIcon(fileName) 是一种有效的方法,但也许我误解了它。除了这个问题,应用程序的其余部分都可以正常工作。

from PySide6.QtGui import QIcon, QScreen
from PySide6.QtWidgets import QApplication, QFileDialog, QMainWindow
from ui_mainwindow import Ui_MainWindow

class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        # Change a few things
        screenSize = QScreen.availableGeometry(QApplication.primaryScreen())
        winXpos = ((screenSize.width() - self.width())/2)
        winYpos = ((screenSize.height() - self.height())/2)
        self.move(winXpos, winYpos)
        self.setWindowTitle('App - Main Window')
        self.setWindowIcon(QIcon('app_icon.png'))
        ...rest of the code...

改成下面这样,会报错

self.setWindowIcon(QIcon.addFile('app_icon.png'))
TypeError: descriptor 'addFile' for 'PySide6.QtGui.QIcon' objects doesn't apply to a 'str' object

这是在 linux 上,使用 Python3.8.10 和 PySide6。该表单与 Qt Creator 放在一起,并使用 pyside6-uic 将 .ui 转换为 .py。有什么想法我哪里出错了吗?

编辑: screenshot of missing icon, post changes suggested in the comments

【问题讨论】:

addFile不是静态函数,它也返回None,所以需要一个QIcon实例(icon = QIcon()),然后使用icon.addFile('app_icon.png'),最后使用setWindowIcon(icon),但这可能不是这里的问题。您确定该图标与您运行脚本的路径相同吗?尝试使用简单的print(QPixmap('app_icon.png').isNull()) 【参考方案1】:

我的猜测是因为addFile 不是静态函数,直接从QIcon 类调用它是行不通的。相反,我认为您需要实例化一个QIcon 对象并将addFile 应用于它:

my_icon = QIcon()
my_icon.addFile('app_icon.png')

self.setWindowIcon(my_icon)

作为建议,请测试该文件是否存在 (os.path.isfile) 以及在 Linux 上您是否有读取权限。或者,尝试从文件路径创建QPixmap 并测试像素图是否为空(Python 中为None

(正如@musicamante 建议的那样,它可能由于某种原因找不到您的文件)。

另外,试试

from PySide6.QtGui import QIcon, QPixmap

my_pixmap = QPixmap(":/app_icon.png")
my_icon = QIcon(my_pixmap)

self.setWindowIcon(my_icon)

详情请参阅the Qt Resource System。

【讨论】:

那行不通,因为addFile() 返回None。必须创建一个实例,然后在该实例上调用addFile(),最后使用setWindowIcon()。但这不应该与文件名构造函数有太大变化,所以,这不是这里的问题。 @musicamante 我认为我们俩都在做同样的事情,只是时间略有不同(比如船只在夜间穿越)。 它们都在同一个文件夹中,os.path.isfile 为每个文件返回 True。上面的方法有点作用——图标现在在面板/任务栏上可见,但在应用程序窗口本身不可见。 @CodgerCoder 你的图标有qrc 文件吗?如果是这样,请确保app_icon.pngqrc 文件位于同一目录中,或其子目录之一中。二、试试my_icon.addFile(":/app_icon.png") @A.Hendry setIconSize()为工具栏默认图标大小,与窗口图标无关(大小由系统决定)

以上是关于使用 Pyside6 缺少主窗口图标的主要内容,如果未能解决你的问题,请参考以下文章

AppStoreConnect 中缺少“上传应用程序图标”选项

Maya 2015-自定义货架按钮缺少图标

QTabWidget 中缺少图标

phpMyAdmin 中缺少所有图标

phpMyAdmin中缺少所有图标

缺少营销图标 Xcode 错误?