QT_SVG格式图片浏览器_源代码下载_详细注释
源代码链接: 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格式图片浏览器_源代码下载_详细注释的更多相关文章
- C#/WPF/WinForm/.NET程序代码实现软件程序开机自动启动的两种常用方法的示例与源码下载带详细注释-源码代码-注册表方式-启动目录快捷方式
C#/WPF/WinForm/.NET程序代码实现软件程序开机自动启动的两种常用方法的示例与源码下载带详细注释-源码代码-注册表方式-启动目录快捷方式 C#实现自动启动的方法-两种方法 源码下载地址: ...
- scrapy_cookie禁用_延迟下载_自定义爬虫setting
如何设置禁止cookie? 在setting中 添加字段: COOKIE_ENABLED = False # False关闭cookie,True ...
- DirectShow中写push模式的source filter流程 + 源代码(内附详细注释)
虽然网上已有很多关于DirectShow写source filter的资料,不过很多刚开始学的朋友总说讲的不是很清楚(可能其中作者省略了许多他认为简 单的过程),读者总希望看到象第一步怎么做,第二步怎 ...
- iOS 新浪微博-5.3 首页微博列表_集成图片浏览器
实际上,我们可以使用李明杰在教程里集成的MJPhotoBrowser,地址: http://code4app.com/ios/快速集成图片浏览器/525e06116803fa7b0a000001 使用 ...
- 笨办法学python - 专业程序员的养成完整版PDF免费下载_百度云盘
笨办法学python - 专业程序员的养成完整版PDF免费下载_百度云盘 提取码:xaln 怎样阅读本书 由于本书结构独特,你必须在学习时遵守几条规则 录入所有代码,禁止复制粘贴 一字不差地录入代码 ...
- java画图程序_图片用字母画出来_源码发布_版本二
在上一个版本:java画图程序_图片用字母画出来_源码发布 基础上,增加了图片同比例缩放,使得大像素图片可以很好地显示画在Notepad++中. 项目结构: 运行效果1: 原图:http://imag ...
- Head_First_Python(中文版)完整版PDF免费下载_百度云盘
Head_First_Python(中文版)完整版PDF免费下载_百度云盘 提取码:bjbg 本书特色 根据认知科学和学习理论的最新研究成果,这本书采用一种适合大脑的丰富格式娓娓道来,而不是长篇累牍地 ...
- Python学习手册(第4版) - 专业程序员的养成完整版PDF免费下载_百度云盘
Python学习手册(第4版) - 专业程序员的养成完整版PDF免费下载_百度云盘 提取码:g7v1 作者简介 作为全球Python培训界的领军人物,<Python学习手册:第4版>作者M ...
- 用PHP实现浏览器点击下载各种格式文档的方法详解【txt apk等等】
[[注:其他文件想设置成下载文件,和下面介绍的方法一致]] 由于现在的浏览器已经可以识别txt文档格式,如果只给txt文档做一个文字链接的话,点击后只是打开一个新窗口显示txt文件的内容,并不能实现点 ...
随机推荐
- 【C语言入门教程】2.5 字符型数据
字符型数据用于在计算机上保存字符编码和一些文本控制命令,多个字符型数据和字符串结束符组成的序列称为字符串.Linux 系统与其他大多数操作系统一样,支持 ASCII编码对字符编码,每个字符占用 1 个 ...
- Ubuntu 14 如何创建软件的 启动器/桌面图标?
如题所示:Ubuntu 14 如何创建软件的 启动器/桌面图标? 解决方案: 将 /usr/share/applications/ 里面的相应图标复制到桌面即可. 同理,也可“拖动”到左边的“启动器栏 ...
- Windows 8 IIS中配置PHP运行环境的方法
在Windows 8 的IIS(8.0)中搭建PHP运行环境: 一:安装IIS服务器 1.进入控制面板>>程序和功能>>打开或关闭Windows 功能,找到Internet信息 ...
- keepalived安装
两台虚拟机 两台配置操作一样 环境配置 [root@lb01 /]# yum -y install openssl openssl-devel [root@lb01 /]# yum -y instal ...
- CentOS 6.5 zabbix 3.0.4 SendEmail报警
官方介绍:http://caspian.dotconf.net/menu/Software/SendEmail/ 1.sendEmail部署 下载安装包到本地.解压 [root@localhost S ...
- 01knockout应用开发之遍历简单数据$Index、$data
在knockout环境下,如何遍历一个简单的数组?对于遍历对象组件的数组来说,很容易,直接foreach:对象名,然后进行属性的绑定即可,而如下数据[10,20,30]这种简单的数组,如何去遍历呢?在 ...
- Palindrome Partitioning II Leetcode
Given a string s, partition s such that every substring of the partition is a palindrome. Return the ...
- ES6中Arguments和Parameters用法解析
原文链接 译文 ECMAScript 6 (也称 ECMAScript 2015) 是ECMAScript 标准的最新版本,显著地完善了JS中参数的处理方式.除了其它新特性外,我们还可以使用rest参 ...
- 下载老版本的Xcode
1.苹果开发者中心,找到Xcode 2.点击下载 3,找到Support 4.找到所需的版本,点击"+"下载 5.安装Xcode,愉快的开发.
- 160809209_李梦鑫_C语言程序设计实验2+选择结构程序设计_进阶
<C语言程序设计>实验报告 学 号 160809209 姓 名 李梦鑫 专业.班 计科16-2班 学 期 2016-2017 第1学期 指导教师 黄俊莲 吴喆 实验地点 C05 机 ...