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语言入门教程】4.5 指针变量的定义与引用
指针变量是包含内存地址的变量.一般的变量直接包含一个特定的值,而指针变量包含的是某一特定数据类型的内存地址.普通变量直接引用其中的值,指针变量则间接引用所指向内存地址中的值.指针变量在使用前需要声明与 ...
- Javascript高级程序设计——执行环境与作用域
Javascript中执行环境是定义了变量或函数有权访问的其他数据,决定了各自的行为,每个执行的环境都有一个与之关联的变量对象,环境中定义的所以变量和函数都保存在这个对象中. 全局执行环境是最外围的一 ...
- JQuery测手速小游戏-遁地龙卷风
(-1)写在前面 我用的chrome49,jquery3.0,我得到过399分,信不信由你. (1)设计思路 两个p元素放在div里,每个p元素的高度和宽度都和div一样,当鼠标放在div上时,第一个 ...
- Codeforces 260 A - A. Laptops
题目链接:http://codeforces.com/contest/456/problem/A 解题报告:有n种电脑,给出每台电脑的价格和质量,要你判断出有没有一种电脑的价格小于另一种电脑但质量却大 ...
- 我所理解的cocos2dx自适配屏幕大小方案
这里主要有两个点: 1.屏幕大小的设置,也就是手机窗口的大小,在各个手机上面或者平板上的屏幕的大小. 这个大小的设置就是代码里面的:glview->setFrameSize(width, hig ...
- [HDU3555]Bomb
[HDU3555]Bomb 试题描述 The counter-terrorists found a time bomb in the dust. But this time the terrorist ...
- [codevs1027]姓名与ID
[codevs1027]姓名与ID 试题描述 有N个人,各自有一个姓名和ID(别名).每个人的姓名和ID都没有重复.这些人依次进入一间房间,然后可能会离开.过程中可以得到一些信息,告知在房间里的某个人 ...
- android oom 全解析
Android oom 有时出现很频繁,这一般不是Android设计的问题,一般是我们的问题. 就我的经验而言,出现oom,无非主要是以下几个方面: 一.加载对象过大 二.相应资源过多,没有来不及释放 ...
- SVN迁移到Git的过程(+ 一些技巧
关于在VCS中SVN和Git之间的迁移(Clone)这个部分网上已经有大批的文章介绍,而且都非常不错,能够满足我们的常见的需求,这里介绍的是我自己整理的一些技巧和使用中出现的一些问题和疑问.阅读本篇文 ...
- Qt5 任务栏托盘功能实现
23333 有一阵子没写博客了,研究了挺长时间qt,学到任务栏托盘时简直无语,网上找得到的代码大多是废码,Qt5不支持或者本身就有毛病不能实现却被n多人转来转去的,甚是无语. 简单托盘功能以下在Qt5 ...