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.