Не меняется иконка всплывающего окна в PyQt6 на MacOS

Рейтинг: 0Ответов: 2Опубликовано: 04.07.2023

У меня есть всплывающее окно:

self.popup = QMessageBox(self)
self.popup.setWindowTitle('Test')
self.popup.move(400, 300)
self.popup.setIcon(QMessageBox.Icon.Warning)
self.popup.setText('Test pop-up window.')
self.popup.setDefaultButton(QMessageBox.StandardButton.Ok)
self.popup.exec()

Почему-то строчка с методом setIcon не меняет иконку окна на MacOS, вместо этого просто показывает стандартную пайтоновскую иконку. На винде все работает и показывает иконку, соответствующую значению Warning.

В PyQt5 все работает, так как используется старая система всплывающих окон.

PyQt5:

PyQt6:

Ответы

▲ 0Принят

Оказывается, в PyQt6 иконки всплывающих окон напрямую зависят от иконки процесса вашего приложения. Если вы запускаете свое приложение из скрипта напрямую без компиляции, то иконки всплывающих окон и название процесса будут питоновскими, а если скомпилировать скрипты в приложение, то иконки и название процесса будут равны иконке и названию вашего скомпилированного приложения.

▲ 0

Я не могу проверить ваш пример, т.к. у меня нету ни PyQt6, ни MacOS.
Но попробуйте код ниже и покажите изображение того, что у вас получается,
если, конечно, вы не получили желаемого результата.

import sys
from PyQt5.Qt import *


class App(QWidget):
    def __init__(self):
        super().__init__()
#                                 vvvvvv       <---- установите свое изображение
        self.setWindowIcon(QIcon('im.png'))             
        layout = QVBoxLayout(self)
        self.button = QPushButton('Show message box')
        layout.addWidget(self.button)
        self.button.clicked.connect(self.showMessageBox)
        
    def showMessageBox(self):
        msgBox = QMessageBox(
            QMessageBox.Icon.Warning, 
            'Hello', 
            'Автоматически закроется через 3 секунды', 
            parent=self
        )
        msgBox.setWindowFlags(
            Qt.WindowType.Dialog
            | Qt.WindowType.WindowTitleHint 
            | Qt.WindowType.WindowSystemMenuHint 
            | Qt.WindowType.WindowCloseButtonHint
        )
        msgBox.move(850, 135)
        
        msgBox.setAttribute(Qt.WidgetAttribute.WA_DeleteOnClose)
        closeTimer = QTimer(msgBox, singleShot=True, interval=3000, 
            timeout=msgBox.close)
        closeTimer.start()
        msgBox.exec()
        

if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = App()
    w.resize(300, 400)
    w.show()
    sys.exit(app.exec())

введите сюда описание изображения