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

发布于 2024-10-19 11:24:00 字数 256 浏览 2 评论 0原文

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

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

As described in the title my problem is that qwebview doesn't load a html file correctly if it resides in my resources. It loads it perfectly if I load it from outside of the resources as normal local file. But this is not an option for me. I would like to bundle the file with the application.

EDIT: By the way, I'm talkin' about external resources from the web. (e.g. http://host.org/somejavascript.js)
Thanks for any help

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

寒尘 2024-10-26 11:24:00

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

外部对象,例如样式表
或 HTML 中引用的图像
文档相对于
基本网址。

下面是适合我的代码。

#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();
}

Please take a look at the second parameter of
void QWebView::setHtml ( const QString & html, const QUrl & baseUrl = QUrl() )
According to documentation:

External objects such as stylesheets
or images referenced in the HTML
document are located relative to
baseUrl.

Below is code that works for me.

#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();
}
心的位置 2024-10-26 11:24:00

外部 URL 必须有一个架构才能使其成为外部 URL,否则“external.org/script.js”会在“external.org/”子路径、“http://external.org/script”下查找“script.js” .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:// 开头的 URL,WebKit 将查找“code.js”和“image” .jpg”在您的应用程序资源中。基本上,只有当文档中的所有相对 URL 都来自 URL 所指向的同一位置时,才能使用 load()。如果您在上述情况下使用了 load(QUrl("qrc:///file.html"));,则 URL (qrc:///file.html) 指向您的资源系统。

如果您还想将资源包含在 HTML 中,则可以在 HTML 文件中使用 qrc:// URL。

External URLs must have a schema to make them external, otherwise "external.org/script.js" looks for "script.js" under the "external.org/" sub-path, "http://external.org/script.js" is an absolute URL.

Edit:
Say you have this HTML file as the resource ":/file.html" and it is coppied from "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>

Then to display this correctly you would need to do the following:

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

That way, WebKit knows where to fetch "code.js" and "image.jpg" from. Using QWebView::load() will not work, as the root URL will be some internal URL, the one starting with qrc://, and WebKit will look for "code.js" and "image.jpg" in your applications resources. Basically, you can only use load() when all the relative URLs in the document come from the same place as the URL is pointing to. And if you used load(QUrl("qrc:///file.html")); in the case above, the URL (qrc:///file.html) is pointing to your resource system.

If you want to also include your resources in the HTML, you can use the qrc:// URLs in the HTML file.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文