网站搜索

javascript - 如果 QWebView 从 qresources 加载 html 文件,它不会加载任何外部资源


如标题所述,我的问题是如果 HTML 文件位于我的资源中,qwebview 无法正确加载它。如果我从资源外部作为普通本地文件加载,它可以完美加载。但这对我来说不是一个可行的选项。我希望将该文件与应用程序捆绑在一起。

编辑:顺便说一下,我指的是来自网络的外部资源。(例如 http://host.org/somejavascript.js)感谢任何帮助

答案#1

请查看
void QWebView::setHtml ( const QString & html, const QUrl & baseUrl=QUrl() ) 的第二个参数 根据文档:

HTML 文档中引用的外部对象,如样式表或图像,是相对于 baseUrl 定位的。

下面是对我有效的代码。

#include <QtCore/QFile>
#include <QtCore/QUrl>
#include <QtGui/QApplication>
#include <QtGui/QMainWindow>
#include <QtWebKit/QWebView>


int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QMainWindow window;
    QWebView webview(&window);

    QFile source(":/google.com.html");
    source.open(QIODevice::ReadOnly);
    webview.setHtml(QString::fromUtf8(source.readAll().constData()), QUrl("http://google.com"));
    window.setCentralWidget(&webview);
    window.show();

    return app.exec();
}

答案#2

外部 URL 必须有一个模式才能使其成为外部的,否则 “external.org/script.js” 会在 “external.org/” 子路径下查找 “script.js”,“http://external.org/script.js” 是一个绝对 URL。

编辑:
假设你有这个 HTML 文件作为资源 ":/file.html",它是从 "http://example.com/" 复制过来的:

<html>
 <head>
  <title>My HTML</title>
  <script type="text/javascript" src="/code.js"></scipt>
 </head>
 <body>
  <img href="/image.jpg" />
 </body>
</html>

然后要正确显示此内容,您需要执行以下操作:

QFile res(":/file.html");
res.open(QIODevice::ReadOnly|QIODevice::Text);
my_webview.setHtml(res.readAll(), QUrl("http://example.com/");

这样,WebKit 就知道从哪里获取“code.js”和“image.jpg”。使用QWebView::load()是行不通的,因为根 URL 会是某个内部 URL,即以 qrc:// 开头的那个,WebKit 会在你的应用程序资源中查找“code.js”和“image.jpg”。基本上,只有当文档中的所有相对 URL 都来自与 URL 指向相同的地方时,你才能使用load()。如果在上述情况下使用load(QUrl("qrc:///file.html"));,URL (qrc:///file.html) 指向的是你的资源系统。

如果你也想在 HTML 中包含你的资源,你可以在 HTML 文件中使用 qrc:// URL。