5

我试图让 Qt WebView 显示一个嵌入为 Qt 资源的 html 文件,但我似乎无法让它工作。我创建了一个新的 Qt Quick 应用程序并添加了一个简单的 qml 文件:

import QtQuick 2.0
import QtWebKit 3.0

Rectangle {
    id: content
    width: 800
    height: 600
    color: "black"

    WebView {
        id: webView
        anchors.fill: parent
        url: "qrc:/res/test.html"
    }
}

然后我(使用设计器)创建了一个如下所示的资源文件:

<RCC>
    <qresource prefix="/res">
        <file>test.html</file>
    </qresource>
</RCC>

并创建了一个简单的 test.html 文件(与 .qrc 文件在同一目录中):

<html>
<head><title>Hello</title></head>
<body>
  <h1>Hello World!</h1>
</body>
</html>

结果只是一个空白的白色窗口。如果我http://www.stackoverflow.com在 qml 文件中使用常规 url ( ) 作为它工作的 url - 将显示页面。如果我使用嵌入图像 ( qrc:/qt-project.org/mac/cursors/images/pluscursor.png) 的名称,则会显示该图像。

在我看来,好像确实添加了html文件(至少在我枚举嵌入式资源时列出了它),但是我对Qt资源系统的理解有限,所以我很可能误解了一些基本的东西。

谁能告诉我我做错了什么?

更新:如果我尝试告诉 Web 视图也从 C++ 加载 url,我已经验证了行为是相同的。我还验证了资源确实是嵌入的——我可以使用 QResource 打开和读取资源。此外,这似乎并不特定于 Qt5:http://qt-project.org/forums/viewthread/18181 有人对 Qt 4.8 有类似问题)。

4

8 回答 8

2

首先,确保资源文件在编译文件夹(一个.RCC文件或一个qrc_<Resource name>.cpp)上正确编译
其次,确保您的文件路径正确(在我的情况下qrc:/images/resource/html/test.html)。您可以打开 QRC 文件并右键单击 html 文件,然后单击Copy Resource Path to Clipboard.
第三,请注意,某些 url 需要更多时间才能完全加载。

最后,我测试了这个场景,效果很好(使用 Qt 5.1.0)

祝你好运 - SMMousavi

于 2013-08-27T22:13:45.587 回答
2

我不认为可以直接在 WebView 中从 qrc 打开资源(我已经尝试了所有 url 变体)。我现在正在做的是将文件复制到本地临时目录然后打开。

QString helpHTMLFile = QStandardPaths::writableLocation(QStandardPaths::TempLocation);
helpHTMLFile.append(QDir::separator());
helpHTMLFile.append("software_manual.html");
QFile(helpHTMLFile).remove();
QFile(":/software_manual.html").copy(helpHTMLFile);

QQmlApplicationEngine engine;
engine.rootContext()->setContextProperty("pathToFile", "file:///"+helpHTMLFile);

然后 QML 看起来像:

WebView {
         anchors.fill: parent
         url: pathToFile
}
于 2015-07-21T07:29:14.260 回答
1

好的,这就是我最终解决这个问题的方法。我最终使用了一个普通的小部件而不是基于 qml 的界面。

然后我必须手动从资源中读取第一个 html 页面并提供基本 url。之后,作为资源嵌入的后续页面和资源可以正常加载。

这是有问题的代码:

QResource res(":/html/index.html");
ui->webView->setHtml(reinterpret_cast<const char *>(res.data()), QUrl("qrc:/html/"));

哪里webViewQWebView。我的 .qrc 文件如下所示:

<RCC>
    <qresource prefix="/">
        <file>html/index.html</file>
    </qresource>
</RCC>

这适用于 Qt 5.5.0。

于 2015-11-26T15:24:14.293 回答
1

加载资源文件的最快方法是使用XMLHttpRequestand loadHtml()。这适用于移动平台的 Qt 5.10.1。

import QtQuick 2.10
import QtQuick.Controls 2.3
import QtWebView 1.1

Page {
    anchors.fill: parent

    WebView {
        id: webView
        anchors.fill: parent

        Component.onCompleted: {

            var resource = 'qrc:/path/to/your/resource.html';

            var xhr = new XMLHttpRequest;
            xhr.open('GET', resource);
            xhr.onreadystatechange = function() {
                if (xhr.readyState === XMLHttpRequest.DONE) {
                    var response = xhr.responseText;
                    webView.loadHtml(response);
                }
            };
            xhr.send();
        }
    }
}
于 2018-04-27T08:08:36.093 回答
0

为什么不直接使用

url: "res/test.html"

代替

url: "qrc:/res/test.html"

?

然后你就不需要使用任何资源文件

于 2013-01-07T21:26:15.633 回答
0

您可以在 QApplication a(argc, argv); 之后放置以下行

QtWebView::initialize();
于 2017-05-10T07:07:34.487 回答
0

至少WebEngineView在 QML 中,最新的 Qt 中提供了 Web 引擎支持的嵌入式资源 URL 加载支持。我无法找到有关此的官方文档,但一个官方示例从资源中加载页面:

WebEngineView {

    url: "qrc:/index.html"
...
}

它也适用于我Qt 5.8.0

于 2017-05-11T10:26:30.877 回答
-1

只需使用 Path-To-File & 如果您将其保存在项目目录中,只需设置文件 url 的名称:“/res/test.html”

& 如果文件在项目目录 url 中:“test.html”

于 2015-07-08T22:23:38.877 回答