#include "WebImageView.h" #include QNetworkAccessManager * WebImageView::mNetManager = new QNetworkAccessManager; QNetworkDiskCache * WebImageView::mNetworkDiskCache = new QNetworkDiskCache(); WebImageView::WebImageView() { mNetworkDiskCache->setCacheDirectory(QDesktopServices::storageLocation(QDesktopServices::CacheLocation)); mNetManager->setCache(mNetworkDiskCache); } const QUrl& WebImageView::url() const { return mUrl; } void WebImageView::setUrl(const QUrl& url) { mUrl = url; mLoading = 0; resetImage(); QNetworkRequest request; request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache); request.setUrl(url); QNetworkReply * reply = mNetManager->get(QNetworkRequest(request)); connect(reply,SIGNAL(finished()), this, SLOT(imageLoaded())); connect(reply,SIGNAL(downloadProgress ( qint64 , qint64 )), this, SLOT(dowloadProgressed(qint64,qint64))); emit urlChanged(); } double WebImageView::loading() const { return mLoading; } void WebImageView::imageLoaded() { QNetworkReply * reply = qobject_cast(sender()); QVariant possibleRedirectUrl = reply->attribute(QNetworkRequest::RedirectionTargetAttribute); mRedirectUrl = this->redirectUrl(possibleRedirectUrl.toUrl(),mRedirectUrl); if (!mRedirectUrl.isEmpty()) { this->setUrl(mRedirectUrl); } else { setImage(Image(reply->readAll())); } reply->deleteLater(); } void WebImageView::dowloadProgressed(qint64 bytes,qint64 total) { mLoading = double(bytes)/double(total); emit loadingChanged(); } QUrl WebImageView::redirectUrl(const QUrl& possibleRedirectUrl, const QUrl& oldRedirectUrl) const { QUrl redirectUrl; if (!possibleRedirectUrl.isEmpty() && possibleRedirectUrl != oldRedirectUrl) { redirectUrl = possibleRedirectUrl; } return redirectUrl; }