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

时间:2011-02-26 10:17:19

标签: javascript c++ qt qwebview qwebkit

如标题中所述,我的问题是qwebview不会正确加载html文件,如果它存在于我的资源中。如果我从资源外部加载它作为普通的本地文件,它会完美地加载它。但这对我来说不是一个选择。我想将文件与应用程序捆绑在一起。

编辑:顺便说一下,我正在谈论网络上的外部资源。 (例如http://host.org/somejavascript.js) 谢谢你的帮助

2 个答案:

答案 0 :(得分:5)

请看一下第二个参数 void QWebView::setHtml ( const QString & html, const QUrl & baseUrl = QUrl() ) 根据{{​​3}}:

  

外部对象,例如样式表   或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();
}

答案 1 :(得分:2)

外部URL必须有一个模式才能使它们成为外部URL,否则“external.org/script.js”会在“external.org/”子路径“http:// external”下查找“script.js”。 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"));,则网址(qrc:///file.html)指向您的资源系统。

如果您还希望在HTML中包含资源,可以使用HTML文件中的qrc:// URL。