2013-12-16 37 views
3

我在QT 5.2中編寫了一個簡單的WebView應用程序。我使用的網站有點沉重,因此我需要緩存它。但問題是,當點擊一個頁面並訪問子頁面時,我得到了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,真正的); () - > enablePersistentStorage(QDir :: homePath());

其他設置(setOfflineStorageDefaultQuota e.t.c.)似乎是可選的。 (可能希望將homePath更改爲像tmpPath等更好的東西)