又是一个悠闲的下午。。。突然想到以前做项目时,写了个简单的网络图片查看器,翻出来看看。。。。。功能太单一了,,鄙视自己。(于是花了一两个小时,将功能完善了一下,将他改装成了图片查看器)
什么是图片查看器?要实现那些功能?我这个人最喜欢模仿了,那就照着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; } } }