QWebView не загружает внешние ресурсы, если загружает html-файл из qresources - PullRequest
6 голосов
/ 26 февраля 2011

Как описано в заголовке, моя проблема в том, что qwebview неправильно загружает HTML-файл, если он находится в моих ресурсах.Он отлично загружается, если я загружаю его извне ресурсов как обычный локальный файл.Но это не вариант для меня.Я хотел бы связать файл с приложением.

РЕДАКТИРОВАТЬ: Кстати, я говорю о внешних ресурсах из Интернета.(например, http://host.org/somejavascript.js) Спасибо за любую помощь

Ответы [ 2 ]

5 голосов
/ 26 февраля 2011

Обратите внимание на второй параметр
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 голосов
/ 26 февраля 2011

Внешние URL-адреса должны иметь схему, чтобы сделать их внешними, в противном случае «external.org/script.js» ищет «script.js» в подпутере «external.org/», http://external.org/script.js" является абсолютным URL.

Edit:
Скажем, у вас есть этот 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» в ресурсах ваших приложений. По сути, вы можете использовать load(), только когда все относительные URL-адреса в документе происходят из того же места, на которое указывает URL-адрес. И если вы использовали load(QUrl("qrc:///file.html")); в приведенном выше случае, URL (qrc:///file.html) указывает на вашу систему ресурсов.

Если вы также хотите включить свои ресурсы в HTML, вы можете использовать URL-адреса qrc: // в файле HTML.

...