如果页面是从 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>,则一切正常,图像已加载。

问题

调查问题,原来是去掉.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

这就是我处理案件的原因。