源代码链接: 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. lua练手基础

    lua的库文件地址: http://luaforge.net/projects/lua官网 http://lua.org --[[ print string. multiple line commen ...

  2. C#操作Excel的技巧与方法 设置单元格等

    C#操作Excel可以分为客户端和插件版本,区别就是是否需要Excel环境,功能实现一样 一.通用操作与处理(有点乱有时间再整理) 1:工程对excel类库的导入,如: c:\program file ...

  3. css固定元素位置(fixed)

    来源:http://www.cnblogs.com/lecaf/archive/2011/03/25/fixed.html fixed是一种特殊的absolute,同样不占文档流,特殊的地方在于fix ...

  4. 我的Java书单之优秀的入门书

    我始终相信,学习任何一门新技术,该技术相关的优秀书籍总是最好的资料.当然了,优秀的视频教程能帮组你快速地了解该技术,但是要深入和系统地去学习该技术,好的书籍就显得尤为重要了.结合我自己学习java的经 ...

  5. Java 的printf(转)

    出处:http://blog.csdn.net/swandragon/article/details/4653600 public class TestPrintf{public static voi ...

  6. [转载]PO BO VO DTO POJO DAO概念及其作用

    原文链接:http://jeoff.blog.51cto.com/186264/88517/ POJO = pure old java object or plain ordinary java ob ...

  7. (原)android中的动画(二)

    帧动画的使用需要在xml文件中指定每一帧所对应的图片 animation-list写法如下: <?xml version="1.0" encoding="utf-8 ...

  8. C/C++相对论——C++中为什么要使用异常?

    C++中为什么要使用异常? 很多人也许知道C++中的异常机制,很多人也许不知道.很多人知道C中常用的assert,也知道在编译时候指定NODEBUG来忽略它. 对于C语言,使用正常的if-else即是 ...

  9. IOS系统ipa软件包在线安装

    如果iis不支持ipa和plist下载,可以添加memi类型. ipa     application/x-plist plist application/xml 下载用普通链接即可: <a h ...

  10. Python自动化之rabbitmq rpc client端代码分析(原创)

    RPC调用client端解析 import pika import uuid # 建立连接 class FibonacciRpcClient(object): def __init__(self): ...