QWebView не загружает внешние ресурсы, если загружает html-файл из qresources

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

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

2 ответа

Решение

Пожалуйста, посмотрите на второй параметр
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();
}

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

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

Другие вопросы по тегам