PyQt5: Как загрузить значок для QWebEngineView?

Я продолжаю бороться с чем-то таким простым, как отображение favicon.ico с помощью QWebEngineView PyQt5.

И трассировка, и сервер тестирования сообщают мне, что pixmap загружается, но это просто не отображается. И наоборот, если я заменю pixmap локальным именем файла, это отобразится.

Я проверил здесь похожие вопросы, но ни один из ответов не работает. Поэтому, пожалуйста, публикуйте только проверенные ответы. Спасибо!

from PyQt5.Qt import *
from PyQt5.QtCore import QUrl
from PyQt5.QtGui import QIcon, QPixmap
from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest
from PyQt5.QtWebEngineWidgets import *
from PyQt5.QtWidgets import QApplication

url_web = 'https://hamwaves.com/swx/index.html'
url_ico = 'https://hamwaves.com/swx/favicon.ico'

class Browser(QWebEngineView):

    def __init__(self):
        QWebEngineView.__init__(self)

        self.nam = QNetworkAccessManager()
        self.nam.finished.connect(self.set_icon)
        self.nam.get(QNetworkRequest(QUrl(url_ico)))

    def set_icon(self, response):
        pixmap = QPixmap()
        pixmap.loadFromData(response.readAll(), format='ico')
        self.setWindowIcon(QIcon(pixmap))

app = QApplication(sys.argv)
web = Browser()
web.load(QUrl(url_web))
web.show()
sys.exit(app.exec_())
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Всегда проверяйте содержимое того, что вы получаете.

Если вы просто нажмете print(response.readAll()), вы увидите это:

<head><title>Not Acceptable!</title></head><body>
<h1>Not Acceptable!</h1><p>
An appropriate representation of the requested resource could not be 
found on this server. This error was generated by Mod_Security.
</p></body></html>

Reformatted for readability

Это довольно распространено для общих «анонимных» сетевых запросов, причина в том, что QNetworkAccessManager сам по себе не устанавливает никакой строки пользовательского агента, и многие веб-серверы игнорируют такие запросы как базовую меру безопасности и частичное ограничение трафика: только браузеры могут отправлять запросы. и они обычно используют соответствующие пользовательские агенты.

Просто используйте общую строку пользовательского агента и вызовите setHeader() по запросу перед его отправкой. Вы можете получить немного отсюда.

request = QNetworkRequest(QUrl(url_ico))
request.setHeader(request.UserAgentHeader, 
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36'
)
self.nam.get(request)

На самом деле во всем этом нет необходимости, поскольку QWebEngineView уже поддерживает эту функцию, поэтому вам нужно просто подключить сигнал iconChanged к соответствующей функции:

class Browser(QWebEngineView):
    def __init__(self):
        super().__init__()
        self.iconChanged.connect(self.setWindowIcon)

При тестировании с вашим URL-адресом, указанным выше, значок правильно устанавливается сразу после загрузки страницы, поэтому нет необходимости использовать QNetworkAccessManager вообще.

Другие вопросы по теме