qt實現本地\網絡圖片查看器

        又是一個悠閒的下午。。。突然想到以前做項目時,寫了個簡單的網絡圖片查看器,翻出來看看。。。。。功能太單一了,,鄙視自己。(於是花了一兩個小時,將功能完善了一下,將他改裝成了圖片查看器)

        什麼是圖片查看器?要實現那些功能?我這個人最喜歡模仿了,那就照着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;
            }
        }
    }
    至於下載圖片時的動畫等待以及下載緩存沒錯誤處理就不詳細說了。

源碼下載



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章