源代码链接: http://pan.baidu.com/s/1pKA5Vcv 密码: ib2x

注:SVG格式图片特点: 1. 文件小 2. 图像中文字独立于图像, 可以编辑,可搜索. 3.没有字体限制 4.可以任意缩放而不破坏图像清晰度和细节

下面实现一个SVG图片浏览器.

显示效果如图(放大超过窗口大小时, 可以通过滚动条拖曳查看图片)

1.

2. (如图,可以任意放大,而不失真)

源代码如下:

注: 1.在实现代码前 需要现在工程文件“.pro”中加入 QT += svg

2.新建项目“SVGTest”,基类选择“QMainWindow", 类名默认---实现主窗口区域

3.新建c++Class文件“SVGWindow”,基类输入“QScrollArea"(手工添加),类名为"SvgWindow"--实现一个带滚动条显示区域

4.新建c++Class文件 “SvgWidget”,基类输入“QSvgWidget”(手工添加), 类名为“SVGWidget”--实现具体的SVG图片显示工作

//svgwidget.h

 /***
* 实现显示SVG图片的函数所在的文件.
*/
#ifndef SVGWIDGET_H
#define SVGWIDGET_H #include <QtSvg/QtSvg>
#include <QtSvg/QSvgWidget>
#include <QtSvg/QSvgRenderer> class SvgWidget : public QSvgWidget
{
Q_OBJECT
public:
SvgWidget(QWidget *parent = );
//响应鼠标的滚动事件,使SVG图片能够通过鼠标滚轮的 滚动 进行 缩放
void wheelEvent (QWheelEvent *);
private:
//渲染器
QSvgRenderer *render; //用于图片显示尺寸 的 确定
}; #endif // SVGWIDGET_H

//svgwidget.cpp

 #include "svgwidget.h"

 SvgWidget::SvgWidget(QWidget *parent)
: QSvgWidget(parent)
{
//获得本窗体的QSvgRenderer对象
render = renderer ();
} //滚轮响应事件,使SVG图片能够鼠标滚动滑轮进行缩放
void SvgWidget::wheelEvent (QWheelEvent *e)
{
//diff的值表示每次滚轮滑动一定的值,图片大小改变的比例
const double diff = 0.1;
/***
* 下面三行代码: 用于获取图片显示区的尺寸大小,以便进行下一步的缩放操作
*/
QSize size = render->defaultSize ();
int width = size.width ();
int height = size.height ();
/***
* 利用QWheelEvent的delta()函数获得滚轮的距离值,通过此值来判断滚轮滚动的方向
* delta() > 0 , 则表示滚轮向前(远离用户方向); delta() < 0, 则表示向后滚动
* (Ps: 鼠标滚动事件,滚轮每滚动1°, 相当于移动8°;而常见的滚轮鼠标拨动一下滚动角度为15°
* 因此,滚轮拨动一下相当于移动了 120(=15*8)
*/
if (e->delta () > )
{
//对图片的长, 宽值进行处理, 放大一定的比例
width = int(this->width () + this->width ()*diff);
height = int(this->height () + this->height ()*diff);
}
else
{
//对图片的长,宽进行处理,缩小一定的比例
width = int(this->width () - this->width ()*diff);
height = int(this->height () - this->height ()*diff);
}
//利用新的长,宽值对图片进行resize()操作
resize (width, height); }

//svgwindow.h

 /*
* 实现一个带滚动条显示区域的函数所在的文件.
* 使图片在放大到超过主窗口大小时, 能通过拖曳
*/
#ifndef SVGWINDOW_H
#define SVGWINDOW_H #include <QScrollArea>
#include "svgwidget.h" class SvgWindow : public QScrollArea
{
Q_OBJECT
public:
SvgWindow(QWidget *parent = );
void setFile(QString);
void mousePressEvent (QMouseEvent *);
void mouseMoveEvent (QMouseEvent *);
private:
SvgWidget *svgWidget;
QPoint mousePressPos;
QPoint scrollBarValueOnMousePress;
}; #endif // SVGWINDOW_H

//svgwindow.cpp

 #include "svgwindow.h"

 SvgWindow::SvgWindow(QWidget *parent)
: QScrollArea(parent)
{
svgWidget = new SvgWidget;
setWidget (svgWidget); //设置滚动条
} //当主窗口对文件进行了选择或修改时, 将调用setFile()函数设置新的文件
void SvgWindow::setFile (QString fileName)
{
//将新的SVG文件加载到svgWidget中显示
svgWidget->load (fileName);
//返回渲染器,去显示控件的内容
QSvgRenderer *render = svgWidget->renderer ();
//使svgWidget窗体按SVG图片的默认尺寸进行显示
svgWidget->resize (render->defaultSize ()); } /***
* 鼠标键按下时,mousePressPos和scrollBarValuesOnMousePress进行初始化,QScrollArea的horizonalScrollBar()
* 和verticalScrollBar()函数可以分别获得svgWindow的水平滚动条和垂直滚动条
*/
void SvgWindow::mousePressEvent (QMouseEvent *event)
{
mousePressPos = event->pos (); //记下当前事件位置
scrollBarValueOnMousePress.rx () = horizontalScrollBar ()->value ();
scrollBarValueOnMousePress.ry () = verticalScrollBar ()->value ();
//设置事件对象的接受信号,表明事件接受器希望事件,意外事件传到父部件
event->accept ();
} /***
* 当鼠标按下并拖曳鼠标时, 触发mouseMoveEvent()函数,通过滑动条的位置设置实现图片图片拖曳的效果
*/
void SvgWindow::mouseMoveEvent (QMouseEvent *event)
{
//对水平滑动条的新位置进行设置
//新水平滑动条位置 = (滑块当前位置 - 鼠标即时返回的位置)(即:滑块移动位置) + 鼠标之前记下的事件位置
horizontalScrollBar ()->setValue (scrollBarValueOnMousePress.x () - event->pos ().x () + mousePressPos.x ());
//对垂直滑动条的新位置进行设置
verticalScrollBar ()->setValue (scrollBarValueOnMousePress.y () - event->pos ().y () + mousePressPos.y ());
horizontalScrollBar ()->update ();
verticalScrollBar ()->update ();
event->accept ();
}

//mainwindow.h

 #ifndef MAINWINDOW_H
#define MAINWINDOW_H #include <QMainWindow>
#include "svgwindow.h" class MainWindow : public QMainWindow
{
Q_OBJECT public:
MainWindow(QWidget *parent = );
~MainWindow();
void createMenu();
public slots:
void slotOpenFile();
private:
SvgWindow *svgWindow; //用于调用相关函数传递选择的文件名
}; #endif // MAINWINDOW_H

//mainwindow.cpp

 #include "mainwindow.h"

 MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
setWindowTitle (tr("SVG Viewer"));
createMenu ();
svgWindow = new SvgWindow;
setCentralWidget (svgWindow);
} //创建菜单栏
void MainWindow::createMenu ()
{
//添加“文件”菜单条
QMenu *fileMenu = menuBar ()->addMenu (tr("文件"));
QAction *openAct = new QAction(tr("打开"), this);
connect (openAct, SIGNAL(triggered(bool)), this, SLOT(slotOpenFile()));
//添加"打开"菜单项
fileMenu->addAction(openAct);
} //通过标准文件对话框选择SVG文件, 并调用SvgWindow的setFile()函数将选择的文件名传递给svgWindow进行显示
void MainWindow::slotOpenFile ()
{
QString name = QFileDialog::getOpenFileName (this, "打开", "/", "svg file(*.svg)");
svgWindow->setFile (name);
} MainWindow::~MainWindow()
{ }

//main.cpp

 #include "mainwindow.h"
#include <QApplication> int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show(); return a.exec();
}

QT_SVG格式图片浏览器_源代码下载_详细注释的更多相关文章

  1. C#/WPF/WinForm/.NET程序代码实现软件程序开机自动启动的两种常用方法的示例与源码下载带详细注释-源码代码-注册表方式-启动目录快捷方式

    C#/WPF/WinForm/.NET程序代码实现软件程序开机自动启动的两种常用方法的示例与源码下载带详细注释-源码代码-注册表方式-启动目录快捷方式 C#实现自动启动的方法-两种方法 源码下载地址: ...

  2. scrapy_cookie禁用_延迟下载_自定义爬虫setting

    如何设置禁止cookie? 在setting中 添加字段: COOKIE_ENABLED = False                            # False关闭cookie,True ...

  3. DirectShow中写push模式的source filter流程 + 源代码(内附详细注释)

    虽然网上已有很多关于DirectShow写source filter的资料,不过很多刚开始学的朋友总说讲的不是很清楚(可能其中作者省略了许多他认为简 单的过程),读者总希望看到象第一步怎么做,第二步怎 ...

  4. iOS 新浪微博-5.3 首页微博列表_集成图片浏览器

    实际上,我们可以使用李明杰在教程里集成的MJPhotoBrowser,地址: http://code4app.com/ios/快速集成图片浏览器/525e06116803fa7b0a000001 使用 ...

  5. 笨办法学python - 专业程序员的养成完整版PDF免费下载_百度云盘

    笨办法学python - 专业程序员的养成完整版PDF免费下载_百度云盘 提取码:xaln  怎样阅读本书 由于本书结构独特,你必须在学习时遵守几条规则 录入所有代码,禁止复制粘贴 一字不差地录入代码 ...

  6. java画图程序_图片用字母画出来_源码发布_版本二

    在上一个版本:java画图程序_图片用字母画出来_源码发布 基础上,增加了图片同比例缩放,使得大像素图片可以很好地显示画在Notepad++中. 项目结构: 运行效果1: 原图:http://imag ...

  7. Head_First_Python(中文版)完整版PDF免费下载_百度云盘

    Head_First_Python(中文版)完整版PDF免费下载_百度云盘 提取码:bjbg 本书特色 根据认知科学和学习理论的最新研究成果,这本书采用一种适合大脑的丰富格式娓娓道来,而不是长篇累牍地 ...

  8. Python学习手册(第4版) - 专业程序员的养成完整版PDF免费下载_百度云盘

    Python学习手册(第4版) - 专业程序员的养成完整版PDF免费下载_百度云盘 提取码:g7v1 作者简介 作为全球Python培训界的领军人物,<Python学习手册:第4版>作者M ...

  9. 用PHP实现浏览器点击下载各种格式文档的方法详解【txt apk等等】

    [[注:其他文件想设置成下载文件,和下面介绍的方法一致]] 由于现在的浏览器已经可以识别txt文档格式,如果只给txt文档做一个文字链接的话,点击后只是打开一个新窗口显示txt文件的内容,并不能实现点 ...

随机推荐

  1. 【C语言入门教程】7.2 结构体数组的定义和引用

    7.2 结构体数组的定义和引用 当需要使用大量的结构体变量时,可使用结构体定义数组,该数组包含与结构体相同的数据结构所组成的连续存储空间.如下例所示: struct student stu_a[50] ...

  2. Android内存性能优化(内部资料总结) eoe转载

    刚入门的童鞋肯能都会有一个疑问,Java不是有虚拟机了么,内存会自动化管理,我们就不必要手动的释放资源了,反正系统会给我们完成.其实Java中没有指针的概念,但是指针的使用方式依然存在,一味的依赖系统 ...

  3. JAVA设计模式 之 观察者模式

    简介: 观察者模式是JDK中最多的设计模式之一,非常有用,观察者模式介绍了一对多的依赖关系及松耦合,有了观察者,你将会消息灵通. 认识观察者模式,看一个报纸.杂志订阅是怎么回事: (1). 报社的业务 ...

  4. 使用Monitor调试Unity3D Android程序日志输出(非DDMS和ADB)

    使用Monitor调试Unity3D Android程序日志输出(非DDMS和ADB) http://www.cnblogs.com/mrkelly/p/4015245.html 以往调试Androi ...

  5. [BZOJ1901]Zju2112 Dynamic Rankings

    [BZOJ1901]Zju2112 Dynamic Rankings 试题描述 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i ...

  6. iOS中的时间和日期

    怎么说?时间和日期不是了不起的属性.了不起的功能,但是,我们决不能够因此就“冷落”它. 一:怎么“搞到货”--如何获取时间.日期 //-=-==当前时间------默认显示“0时区”时间 NSDate ...

  7. 技术博客(初用markdown)。

    技术博客 菜鸟教程在这个网站我学到许多有趣的东西,并且弥补了我之前的一些不足之处. 以下为我学习到的内容 输出不同的三位数 以下为代码和输出结果 *** #include<stdio.h> ...

  8. BZOJ 1462: Superkmp

    Description 匹配字符串A,B,匹配条件是在A长度为=B的子串中,排名顺序相同. Sol KMP+树状数组. KMP匹配的时候计算排名就可以了啊...这个东西可以用树状数组维护. 这题是个双 ...

  9. 5.1---二进制数插入(CC150)

    public class Solution { public static int binInsert(int n, int m, int i, int j) { // write code here ...

  10. ndk学习10: linux文件系统

    画了一天的思维导图,好累啊 一.概述 二.文件IO 三.缓冲区输入输出 四.高级IO 五.文件和目录 来自为知笔记(Wiz)