源代码链接: 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. mysql python image 图像存储读取

    最近做一些数据库调研的工作,目标是实现影像更快的入库.出库.查询,并实现并行访问等操作. 将结果总结成一个mysqlImg类. 关于mongodb的图像存储,参见http://www.cnblogs. ...

  2. C#GDI+图像处理

    支持格式:BMP.GIF.JPEG.EXIF.PNG.TIFF.ICON.WMF.EMF等,几乎涵盖所有常用格式 图像类: Image类:Bitmap和Metafile的类提供功能的抽象基类. Met ...

  3. 弹窗插件 popup.js 完美修正版

    作为信息展示弹出窗口,很有用!是一个js插件,不是jQuery插件! 地址:http://img.jb51.net/online/popup/popup.html

  4. HDU 4941 Magical Forest(map映射+二分查找)杭电多校训练赛第七场1007

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4941 解题报告:给你一个n*m的矩阵,矩阵的一些方格中有水果,每个水果有一个能量值,现在有三种操作,第 ...

  5. Codeforces 259 B - Little Pony and Sort by Shift

    题目链接:http://codeforces.com/contest/454/problem/B 解题报告:太渣了,这个模拟题最后跑大数据的时候挂了,最后还花了很久才过,用的最笨的方法,直接模拟,代码 ...

  6. php学习笔记(1)-----基础

    语法 <?PHP //code here?> 变量以$开头 字符串并置运算符 . echo $txt1 . " " . $txt2计算字符串长度 strlen() 空格 ...

  7. 他们在军训,我在搞 OI(Ending)

    Day 7 上午看看数学书,老师让我把导数相关的概念学了.这也没有多高大上,就是一坨公式需要背,什么 (a)' = 0 啦,什么 (xn)' = n·xn-1 啦,什么 sin'(x) = cos(x ...

  8. velocity使用知识总结

    1.后台传递List<bean> ,前台循环获取 List<Lead> leads = leadService.getAllLeadLists(); mv.addObject( ...

  9. CISCO系列交换机如何清空配置

    今天刚好要还原一台CISCO配置的命令,这个毕竟属于我的专业小编就献丑一回,望大家见谅! 工具/原料   CISCO系列交换 方法/步骤   1 首先备份之前的配置信息 copy flash:conf ...

  10. HTTP协议概念篇

    1.概念 协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器. ...