【问题标题】:QWebView cachingQWebView 缓存
【发布时间】:2013-12-16 16:42:15
【问题描述】:

我正在 QT 5.2 中编写一个简单的 WebView 应用程序。我使用的网站有点重,所以我需要缓存它。但问题是当点击页面并访问子页面时,我收到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());
    }
}

【问题讨论】:

  • 我遇到了同样的症状,但我没有使用缓存。
  • 对我来说,本地 html 文件的路径错误。希望对你有所帮助。

标签: qt qtwebkit qwebview


【解决方案1】:

我制作完成后离线存储工作正常:

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

其他设置(setOfflineStorageDefaultQuota 等)似乎是可选的。 (可能想将 homePath 更改为更好的东西,例如 tmpPath 等)

【讨论】:

    【解决方案2】:

    对我来说,这是重定向的问题(例如 www.xbox.com 为您提供 xbox.com:80/en-US/),它给了我一个 0 字节长度的响应,只是一个标题。我也需要处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-26
      • 2011-11-09
      相关资源
      最近更新 更多