QWebEngineView не загружает относительные ресурсы со страницы html, если страница загружается из системы ресурсов Qt RCC
edit: После комментария @eyllanesc, вот минимальный пример, размещенный на github. Тест запускается на Qt5.9, на OS X 10.12.
Базовый HTML
Давайте создадим минимальный пример HTML, загружающий изображение по относительному пути, test.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
</head>
<body>
<div>Image:</div>
<img src="img.jpg"></img>
</body>
</html>
Этот файл создается в папке, также содержащей img.jpg (которая должна быть изображением очаровательного щенка)
Когда test.html открывается прямо в браузере, он показывает изображение, как и ожидалось.
Проблема с qrc и относительными путями
Теперь, если мы встроим оба ресурса в приложение Qt со следующим файлом.qrc:
<!DOCTYPE RCC><RCC version="1.0">
<qresource>
<file alias="test.html">resources/web/test.html</file>
<file alias="img.jpg">resources/web/img.jpg</file>
</qresource>
</RCC>
Мы можем открыть страницу HTML в QWebEngineView
с некоторым кодом формы:
mWebView->load(QUrl{"qrc:///test.html"});
Страница загружена, но изображение нет.
Включение консоли веб-разработчика (запустив приложение с аргументом --remote-debugging-port=8888
) и перейдя на вкладку Сеть, мы видим, что даже не происходит попытка загрузки img.jpg.
С абсолютным путем нет проблем
Если элемент изображения был изменен на <img src="qrc:///img.jpg"></img>
, то все работает нормально и изображение загружается.
Вопросы
- Это ограничение системы qrc по конструкции?
- Есть ли способ обойти это? (без жесткого кодирования абсолютного пути со схемой)
2 ответа
Основная проблема заключается в том, как объявляется URL-адрес файла.html:
В случае @ ad-n он следовал документам:
...
Например, путь к файлу: /images/cut.png или URL-адрес qrc: /// images / cut.png предоставят доступ к файлу cut.png, местоположение которого в исходном дереве приложения - images / cut.png. Это можно изменить, используя атрибут alias тега file:
...
И использовать: qrc:///home.html
Однако в моем случае я использовал Qt Creator, чтобы предоставить мне URL, как показано на следующем рисунке:
И использовать: qrc:/home.html
Вот почему я работаю над своим делом.
При исследовании проблемы выясняется, что избавление от всех псевдонимов в файле .rcc и, соответственно, изменение пути к ресурсу в коде, позволяет использовать относительные пути.
Вот изменения в источниках:
<!DOCTYPE RCC><RCC version="1.0">
<qresource>
<file>resources/web/test.html</file>
<file>resources/web/img.jpg</file>
</qresource>
</RCC>
-
mWebView->load(QUrl{"qrc:///resources/web/test.html"});
Я пока не принимаю этот ответ, так как это похоже на обходной путь. Надеюсь, есть способ заставить его работать с псевдонимами.