Я пишу простое приложение WebView в QT 5.2. Веб-сайт, который я использую, немного тяжелый, поэтому мне нужно его кэшировать. Но проблема в том, что при нажатии на страницу и посещении вспомогательных страниц я получаю ошибки QIODevice::read: device not open
. В конце я заканчиваю пустой, белой страницей. Где я неправ?Кэширование QWebView
Вот код:
WebsiteWidget::WebsiteWidget(QWidget *parent) :
QWidget(parent)
{
m_url = QUrl("http://www.google.com/");
QWebSettings::globalSettings()->setAttribute(QWebSettings::DeveloperExtrasEnabled, true);
QWebSettings::globalSettings()->setAttribute(QWebSettings::LocalStorageEnabled, true);
QWebSettings::globalSettings()->setAttribute(QWebSettings::JavascriptEnabled, true);
QWebSettings::globalSettings()->setAttribute(QWebSettings::PluginsEnabled, true);
m_websiteContentLayout = new QHBoxLayout();
m_webView = new QWebView(this);
QNetworkAccessManager* manager = new QNetworkAccessManager(this);
QNetworkDiskCache* diskCache = new QNetworkDiskCache(this);
QString location = QStandardPaths::writableLocation(QStandardPaths::CacheLocation);
diskCache->setCacheDirectory(location);
manager->setCache(diskCache);
m_webView->page()->setNetworkAccessManager(manager);
m_webView->page()->settings()->setMaximumPagesInCache(10);
QNetworkRequest request = QNetworkRequest();
request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache);
request.setUrl(m_url);
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
manager->get(request);
m_websiteContentLayout->addWidget(m_webView);
m_websiteContentLayout->setContentsMargins(0, 0, 0, 0);
this->setLayout(m_websiteContentLayout);
}
void WebsiteWidget::replyFinished(QNetworkReply* reply)
{
QByteArray data=reply->readAll();
QString str(data);
if(reply->url() == m_url)
{
m_webView->setHtml(str, reply->url());
}
}
У меня такие же симптомы, но я не использую кеширование. – Dasun
Для меня это был неправильный путь для локального файла html. Надеюсь, это поможет вам. – Dasun