如果页面是从 Qt RCC 资源系统加载的,QWebEngineView 不会从 html 页面加载相关资源
QWebEngineView does not load relative resources from an html page if the page is loaded from Qt RCC resource system
编辑:根据@eyllanesc 评论,这里是a minimal example hosted on github。测试是 运行 on Qt5.9, on 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>
我们可以使用以下形式的一些代码在 QWebEngineView
中打开 HTML 页面:
mWebView->load(QUrl{"qrc:///test.html"});
页面已加载,但图像未加载。
启用 Web 开发人员控制台(通过 运行 将应用程序与参数 --remote-debugging-port=8888
连接)并转到网络选项卡,我们可以看到 甚至没有尝试 加载 img.jpg.
使用绝对路径,没问题
如果图像元素更改为 <img src="qrc:///img.jpg"></img>
,则一切正常,图像已加载。
问题
- 这是 qrc 系统的设计限制吗?
- 有没有办法解决这个问题? (没有使用方案硬编码绝对路径)
调查问题,原来是去掉.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"});
我还不接受这个答案,因为它感觉像是一种解决方法。希望有办法让它与别名一起工作。
主要问题似乎是 .html 文件的 URL 是如何声明的:
在@ad-n 的情况下,他遵循了 docs:
...
For example, the file path :/images/cut.png or the URL
qrc:/// images/cut.png would give access to the cut.png file, whose
location in the application's source tree is images/cut.png. This can
be changed using the file tag's alias attribute:
...
并使用:qrc:///home.html
但是在我的例子中,我使用 Qt Creator 为我提供 url,如下图所示:
并使用:qrc:/home.html
这就是我处理案件的原因。
编辑:根据@eyllanesc 评论,这里是a minimal example hosted on github。测试是 运行 on Qt5.9, on 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>
我们可以使用以下形式的一些代码在 QWebEngineView
中打开 HTML 页面:
mWebView->load(QUrl{"qrc:///test.html"});
页面已加载,但图像未加载。
启用 Web 开发人员控制台(通过 运行 将应用程序与参数 --remote-debugging-port=8888
连接)并转到网络选项卡,我们可以看到 甚至没有尝试 加载 img.jpg.
使用绝对路径,没问题
如果图像元素更改为 <img src="qrc:///img.jpg"></img>
,则一切正常,图像已加载。
问题
- 这是 qrc 系统的设计限制吗?
- 有没有办法解决这个问题? (没有使用方案硬编码绝对路径)
调查问题,原来是去掉.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"});
我还不接受这个答案,因为它感觉像是一种解决方法。希望有办法让它与别名一起工作。
主要问题似乎是 .html 文件的 URL 是如何声明的:
在@ad-n 的情况下,他遵循了 docs:
...
For example, the file path :/images/cut.png or the URL qrc:/// images/cut.png would give access to the cut.png file, whose location in the application's source tree is images/cut.png. This can be changed using the file tag's alias attribute:
...
并使用:qrc:///home.html
但是在我的例子中,我使用 Qt Creator 为我提供 url,如下图所示:
并使用:qrc:/home.html
这就是我处理案件的原因。