2013-12-16 5 views
3

Я пишу простое приложение 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()); 
    } 
} 
+0

У меня такие же симптомы, но я не использую кеширование. – Dasun

+0

Для меня это был неправильный путь для локального файла html. Надеюсь, это поможет вам. – Dasun

ответ

0

Для меня это была проблема с переадресовывает (как www.xbox.com дает xbox.com:80/en-US/), который дал мне ответ с 0 байтов, просто заголовок. Мне тоже нужно было справиться.

0

У меня есть автономное хранилище работает после того, как я сделал:

webView-> Настройки() -> SetAttribute (QWebSettings :: LocalStorageEnabled, правда); webView-> settings() -> enablePersistentStorage (QDir :: homePath());

Другие настройки (setOfflineStorageDefaultQuota e.t.c.) кажутся необязательными. (можно изменить homePath на что-то лучше, например tmpPath и т. Д.)