Qt项目实战2:简单的图片查看器(1)

在博文http://www.cnblogs.com/hancq/p/5817108.html中介绍了使用空的Qt项目创建带有菜单栏、工具栏的界面。

这里,使用一个简单的图片查看器项目,来熟悉一下Qt的图片显示和基本操作。

该项目分为两部分:

(1)实现图片的打开、关闭、居中显示、上一张/下一张切换

(2)实现图片的放大、缩小、左旋、右旋、另存为等操作

需要用的Qt类:

QFileDialog  QImage  QPixmap  QFileInfo  

使用空的Qt项目创建带有菜单栏和工具栏的界面的操作参考博文http://www.cnblogs.com/hancq/p/5817108.html

1、页面布局

根据自己的实际需求添加菜单栏和工具栏,参考如下图:

工具栏图标依次是:打开图片、关闭图片、上一张、下一张、左旋、右旋、放大、缩小

此项目算是一个小demo,主要是熟悉图片处理的相关的操作,基础类和操作熟悉之后可以加入复杂的功能。

2、实现图片的打开、关闭

文件打开和显示的步骤:

(1)使用QFileDislog函数选择一个图片文件,获取到文件的路径名;

(2)使用QImage类加载文件,生成image对象;

(3)使用QLabel类的setPixmap函数将图片显示在界面上。

参考代码如下:

 1 void ImageViewer::openActionTriggered(void)
 2 {
 3     filename = QFileDialog::getOpenFileName(this, tr("Select image:"),
 4         "D:\\Documents\\Pictures", tr("Images (*.png *.bmp *.jpg *.gif)"));
 5     if (filename.isEmpty()) {
 6         return ;
 7     }
 8
 9     QImage image;
10     if (!image.load(filename)) {
11         QMessageBox::information(this, tr("Error"), tr("Open file error"));
12         return ;
13     }
14
15     QPixmap pixmap = QPixmap::fromImage(image);
16     imageSize = pixmap.size();
17
18     imageLabel->setPixmap(pixmap);
19     imageLabel->resize(imageSize);
20     //qDebug() << "filname: " << filename;
21
22     setWindowTitle(QFileInfo(filename).fileName() + tr(" - imageViewer"));
23 }

图片关闭时,只需将label清空即可:

1 void ImageViewer::closeActionTriggered(void)
2 {
3     imageLabel->clear();
4     imageLabel->resize(QSize(200, 100));
5     setWindowTitle(tr("imageViewer"));
6 }

图片打开、关闭的函数,作为QAction的槽函数触发即可:

1     connect(openAction, SIGNAL(triggered(bool)), this, SLOT(openActionTriggered()));
2     connect(closeAction, SIGNAL(triggered(bool)), this, SLOT(closeActionTriggered()));

提示:在图片打开时可以将界面名改为文件名+标题,关闭时去掉文件名,方便用户使用。

3、实现图片居中显示、页面自动调整

通过上述操作,已经可以创建一个label,并将图片显示在label中。

但是会出现各种问题,例如:label在resize时部分尺寸超出页面的大小显示不全、图片不能居中显示等。

需要做以下操作来解决上述问题:

(1)使用QLabel类的setPixmap函数将图片显示在界面上;

(2)创建一个QScrollArea部件,将label加载到scrollarea中;

(3)设置scrollarea部件为中心对齐,无边框;

(4)设置页面布局方式为格点布局,并将scrollarea部件增加到0,0点上。

参考代码:

 1 void ImageShow::setImageShowWidget(void)
 2 {
 3     /* label show image */
 4     imageLabel = new QLabel();
 5
 6     QScrollArea *imageScrollArea = new QScrollArea();
 7     imageScrollArea->setAlignment(Qt::AlignCenter);
 8     imageScrollArea->setFrameShape(QFrame::NoFrame);
 9     imageScrollArea->setWidget(imageLabel);
10
11     QGridLayout *mainLayout = new QGridLayout();
12     mainLayout->addWidget(imageScrollArea, 0, 0);
13     centralWidget->setLayout(mainLayout);
14 }

当打开一张图片时,自动居中对齐;当图片大小超过中心窗口尺寸时,scrollarea部件出现滑动条,显示配合放大、缩小功能,显示效果更好。

效果如下图所示:

4、实现上一张/下一张切换

在打开文件同时,获取到当前目录的文件列表,保存到文件信息链表中。

当需要对打开的文件上、下切换时,只需对当前链表的下表进行轮询并获取图片显示即可。

 1 void ImageViewer::getImgInfoList(QFileInfoList &imgInfoList)
 2 {
 3     imgInfoList.clear();
 4
 5     QDir dir = QFileInfo(filename).absolutePath();
 6     QFileInfoList infoList = dir.entryInfoList(QDir::Files);
 7     //qDebug() << "GET:" << infoList.count() << dir;
 8
 9     QFileInfo info;
10     for (int i = 0; i < infoList.count(); i++) {
11         info = infoList.at(i);
12         //qDebug() << i << info.absolutePath();
13         QString suffix = info.suffix();
14
15         if (suffix == "jpg" || suffix == "bmp" || suffix == "png") {
16             imgInfoList.append(info);
17             //qDebug() << "getImgInfoList:" << i << info.absolutePath() << info.suffix();
18         }
19     }
20
21     QFileInfo curImageInfo = QFileInfo(filename);
22     for (int j = 0; j < imgInfoList.count(); j++) {
23         info = imgInfoList.at(j);
24         if (info.fileName() == curImageInfo.fileName()) {
25             index = j;
26             //qDebug() << "curImage index:" << index;
27         }
28     }
29 }

在菜单栏和工具栏增加上一张/下一张按钮,实现QAction行为触发。

实现步骤:

(1)使用QFileInfoList链表保存下已经打开的文件所在路径下所有的图片文件的信息;

(2)记录下当前文件的下表,上一张/下一张时间触发时,对下标进行增减;

(3)获取到文件路径和文件名;

(4)重新构造image对象,加载图片文件并显示。

参考代码:

 1 void ImageViewer::lastActionTriggered(void)
 2 {
 3     //getImgInfoList(imgInfoList);
 4
 5     index = index - 1;
 6     int count = imgInfoList.count();
 7     //qDebug() << "left count: " << count << "index: " << index;
 8     if (index < 0) {
 9         index = count - 1;
10     }
11
12     filename.clear();
13     filename.append(path);
14     filename += "/";
15     filename += imgInfoList.at(index).fileName();
16     //qDebug() << "filname: " << filename;
17
18     QImage image;
19     if (!image.load(filename)) {
20         QMessageBox::information(this, tr("Error"), tr("Open file error"));
21         return ;
22     }
23
24     QPixmap pixmap = QPixmap::fromImage(image);
25     imageSize = pixmap.size();
26
27     imageLabel->setPixmap(pixmap);
28     imageLabel->resize(imageSize);
29
30     setWindowTitle(QFileInfo(filename).fileName() + tr(" - imageViewer"));
31 }
32
33 void ImageViewer::nextActionTriggered(void)
34 {
35     //getImgInfoList(imgInfoList);
36
37     index = index + 1;
38     int count = imgInfoList.count();
39     //qDebug() << "right count: " << count << "index: " << index;
40     if (index == count) {
41         index = 0;
42     }
43
44     filename.clear();
45     filename.append(path);
46     filename += "/";
47     filename += imgInfoList.at(index).fileName();
48     //qDebug() << "filname: " << filename;
49
50     QImage image;
51     if (!image.load(filename)) {
52         QMessageBox::information(this, tr("Error"), tr("Open file error"));
53         return ;
54     }
55
56     QPixmap pixmap = QPixmap::fromImage(image);
57     imageSize = pixmap.size();
58
59     imageLabel->setPixmap(pixmap);
60     imageLabel->resize(imageSize);
61
62     setWindowTitle(QFileInfo(filename).fileName() + tr(" - imageViewer"));
63 }

需要注意的地方:

(1)图片关闭、上一张、下一张操作是在图片打开成功之后才能操作,所以误点按钮导致程序崩溃,需要加使能操作。

(2)此处图片对象的创建没有使用new操作,理由是需要手动delete比较麻烦;直接使用局部变量,编译器会自动释放资源。

(3)此处使用空的Qt模板创建,不使用系统的ui文件,需要手动初始化菜单栏、工具栏和中心窗口等。

本文为原创博文,转载请注明作者及出处,更新链接:http://www.cnblogs.com/hancq/p/6016400.html

时间: 2024-10-12 11:38:19

Qt项目实战2:简单的图片查看器(1)的相关文章

最简单的图片查看器

最简单的图片查看器,支持放大.缩小.鼠标拖动. 下面是代码,非常简单: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>pic view</title> </head> <body> <div id="pic" class="pic"

iOS开发-简单的图片查看器

现在你只要拿着手机,不管你Android还是iOS,新闻类的App不可避免都有一个功能就是图片查看,做个专题,查看一下内容,App Store中也有专门针对图片浏览的App,鉴于目前所知有限,无法做到那么高大上的App,简单的做个美女查看的Demo.没有太多的功能,上一张,下一张,标签,图片,简简单的,深刻的感觉到知识就是力量,目前知识有限的结果就是Demo简单,且学且珍惜吧. 1.新建项目(如果不会可以参考本人之前的文章),然后在StoryBoard中进行布局,将Girl文件夹中的图片拖入项目

【Android实战】Gallary+ImageSwicther图片查看器

仿照现在各大新闻网站图片新闻的浏览模式,上面展示具体图片(ImageSwitch),下面是可以滑动的小图片(Gallery). 其中需要注意的是ImageSwitch需要定义一个工厂返回的组件,并且可以设置动画效果. Gallery用适配器加载布局,其Gallery可设置,两个图片的间隔距离. 布局: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_wi

制作手机使用的网页图片查看器

这几天抽空在为项目开发一个量身的图片查看器,目前已初步完成需求 开发场景是:在一个多文件下载展示列表中,如检测某些文件为图片时,则点击该文件时打开图片查看器展示该图片,并将列表内其它图片同时展示查看器队列内,可供前后滑动查看及其它附带功能 乍一听功能点似乎有点多而且有些复杂,需要梳理一下 功能点整理 首先,我们要获得点击的图片文件对象及符合条件的图片文件对象集 其次,图片查看器的制作及图片队列展示 然后,图片友好加载方式 最后,图片查看器触摸滑动及滑动后相关功能的实现 简单整理了一下,好像也不多

发布两款JQ小插件(图片查看器 + 分类选择器),开源

图片查看器,github地址:https://github.com/VaJoy/imgViewer 效果如下: 这款当初大概写了2小时,有点匆忙地赶出来的,使用的接口很简单: $.bindViewer(".viewer-item"); 它的实现其实也没啥复杂的原理,唯一觉得可说的地方是图片展开的过程 —— 从小变大动态过程的实现.主要是靠这一段代码实现的: $(this).css({"top": win_h / 2 + sroll_t, "margin-l

WPF下的仿QQ图片查看器

本例中的大图模式使用图片控件展示,监听控件的鼠标滚轮事件和移动事件,缩略图和鹰眼模式采用装饰器对象IndicatorObject和Canvas布局.百分比使用一个定时器,根据图片的放大倍数计算具体的数值显示. 首先看看效果图: 以下开始绘制图片 定义缩略图上白色的矩形,这其实是一个Indicator,它的外围是一个Canvas,然后缩略图是一个Image控件 internal class IndicatorObject : ContentControl { private MaskCanvas

图片查看器(可拖拽,缩放,轮播)

一直都想写一个图片轮播,可是却一直都没有静下心来,今天终于有时间,就来做个图片查看器吧 功能:拖拽,缩放,还原,轮播,透明度 拖拽实现原理:鼠标按下onmousedown,鼠标移动onmousemove,鼠标松开onmouseup释放鼠标按下和移动的函数,一定是按下鼠标的同时进行移动,这里指的都是鼠标左键! 这里的难点就是清除默认事件,反正我是这样认为的,花了好几个小时才弄出来.写完之后发现,鼠标点一下再松开,图片就粘再指针上了,一直跟着指针跑,郁闷了好久,为什么会发生这种事,仔仔细细看了几十遍

Android中的图片查看器

本案例,使用Eclipse来开发Android2.1版本的图片查看器. 1)首先,打开Eclipse,新建一个Android2.1版本的项目ShowTu,打开res/values中目录下的strings.xml,将其中代码替换成一下代码: 路径:ShowTu/res/valus/string.xml <?xml version="1.0" encoding="utf-8"?> <resources> <string name="

小白C#窗体系列-03.图片查看器

新增拖拽功能 如果出现看不见的情况明天就好了,好了我们步入正题,作为一个吊丝,如果你用你女朋友/女神的照片做了个图片浏览器,那么你每次用来看图的时候第一张看的都是她了,当看到第二张你想看见的图时,是不是有个鲜明的对比呢,是落差还是什么的,就因人而异咯~~又开始想入非非了?哈哈,不扯淡了,继续:4步走~~~ 软件下载(.NET 4.0 框架)http://pan.baidu.com/s/1i387wJ7  [源码看下面] 逆天图片查看器1.0.1 下载   http://pan.baidu.com