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;
            }
        }
    }
    至于下载图片时的动画等待以及下载缓存没错误处理就不详细说了。

源码下载



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