又是一個悠閒的下午。。。突然想到以前做項目時,寫了個簡單的網絡圖片查看器,翻出來看看。。。。。功能太單一了,,鄙視自己。(於是花了一兩個小時,將功能完善了一下,將他改裝成了圖片查看器)
什麼是圖片查看器?要實現那些功能?我這個人最喜歡模仿了,那就照着windows自帶的圖片查看程序模仿吧。(windows自帶不支持網絡)
功能點:放大,縮小,旋轉,上一張,下一張,圖片顯示不全時拖拽?。。。網絡圖片是不是得有個下載?
先展示下效果:
重點實現:
本地圖片顯示:
通過QLabel來顯示圖片,m_pImageLabel->setScaledContents(true);設置該屬性爲true,就可以讓圖片跟隨label的大小自動去填充滿整個label,這樣實現圖片的放大和縮小就是通控制label的大小來實現。
- 顯示圖片
QRect rc = pm.rect(); m_pImageLabel->setFixedSize(rc.size()); m_pImageLabel->setPixmap(pm);
- 放大圖片
m_pImageLabel->setFixedSize(m_pImageLabel->size() * 1.2);
- 縮小圖片
m_pImageLabel->setFixedSize(m_pImageLabel->size() / 1.2);
- 旋轉--旋轉通過QPixmap的矩陣變換實現
QMatrix leftmatrix; leftmatrix.rotate(90); this->showCurrentImage(m_pImageLabel->pixmap()->transformed(leftmatrix, Qt::SmoothTransformation));
- 上一張/下一張--從url取相依的值顯示出來
showCurrentImage(m_oImagesPathArray[--m_nCurrentIndex]);
網絡圖片顯示:
網絡圖片顯示就是先通過請求,將網絡圖片下載下來,再調用本地顯示的方法去顯示,這裏重點分析下下載。
- 下載圖片
至於下載圖片時的動畫等待以及下載緩存沒錯誤處理就不詳細說了。m_pNetworkManager = new QNetworkAccessManager(this); connect(m_pNetworkManager, SIGNAL(finished(QNetworkReply *)), this, SLOT(replyFinished(QNetworkReply *))); m_pWaitMovie->start(); QNetworkRequest request; request.setUrl(QUrl(url)); pReply = m_pNetworkManager->get(request); pReply->setProperty("iamgeUrl", url); void CImageView::replyFinished(QNetworkReply *reply) { // 獲取響應狀態碼,200表示正常 if (reply->error() == QNetworkReply::NoError) { QByteArray bytes = reply->readAll(); if (pReply == reply) { QPixmap pm; pm.loadFromData(bytes); showCurrentImage(pm); m_pWaitMovie->stop(); } QString url = pReply->property("iamgeUrl").toString(); QFile file(m_imageCachePath + getFileName(url)); if (file.open(QIODevice::Append)) file.write(bytes); file.close(); } else { if (pReply == reply) { // 錯誤處理-顯示錯誤信息,或顯示加載錯誤圖。 showCurrentImage(QPixmap(":/iocn/res/reloadImage.png")); m_pImageLabel->setProperty("loadFailUrl", pReply->property("iamgeUrl").toString()); m_bIsLoadFail = true; } } }