Кэширование QWebView

Я пишу простое приложение WebView в QT 5.2. Веб-сайт, который я использую, немного тяжеловат, поэтому мне нужно его кэшировать. Но проблема в том, что при нажатии на страницу и посещении подстраниц я получаю QIODevice::read: device not open ошибки. В конце я получаю пустую белую страницу. Где я ошибся?

Вот код:

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());
    }
}

person Thunder    schedule 16.12.2013    source источник
comment
У меня такие же симптомы, но я не использую кеширование.   -  person Dasun    schedule 11.01.2014
comment
Для меня это был неправильный путь для локального html-файла. Надеюсь, это может помочь вам.   -  person Dasun    schedule 11.01.2014


Ответы (2)


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

webView->settings()->setAttribute(QWebSettings::LocalStorageEnabled, true); webView->settings()->enablePersistentStorage(QDir::homePath());

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

person ktechpit.org    schedule 01.07.2014

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

person Thunder    schedule 21.01.2014