Я продолжаю бороться с чем-то таким простым, как отображение 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_())






Всегда проверяйте содержимое того, что вы получаете.
Если вы просто нажмете 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 вообще.