タイトルで説明したように、私の問題は、リソースにある場合、qwebview が html ファイルを正しくロードしないことです。リソースの外部から通常のローカルファイルとしてロードすると、完全にロードされます。しかし、これは私にとって選択肢ではありません。ファイルをアプリケーションにバンドルしたいと考えています。
編集: ところで、私はウェブからの外部リソースについて話しています。(例http://host.org/somejavascript.js)助けてくれてありがとう
タイトルで説明したように、私の問題は、リソースにある場合、qwebview が html ファイルを正しくロードしないことです。リソースの外部から通常のローカルファイルとしてロードすると、完全にロードされます。しかし、これは私にとって選択肢ではありません。ファイルをアプリケーションにバンドルしたいと考えています。
編集: ところで、私はウェブからの外部リソースについて話しています。(例http://host.org/somejavascript.js)助けてくれてありがとう
ドキュメント
void QWebView::setHtml ( const QString & html, const QUrl & baseUrl = QUrl() )
に
よるとの2番目のパラメータを見てください:
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();
}
外部 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 は qrc:// で始まる内部 URL になり、WebKit はアプリケーション リソースで「code.js」と「image.jpg」を検索するため、使用は機能しません。load()
基本的に、ドキュメント内のすべての相対 URL が、URL が指しているのと同じ場所から来ている場合にのみ使用できます。上記の場合load(QUrl("qrc:///file.html"));
、URL ( qrc:///file.html
) はリソース システムを指しています。
リソースも HTML に含めたい場合は、HTML ファイルで qrc:// URL を使用できます。