SVG的英文全称是Scalable Vector Graphics,即可缩放的矢量图形。它是有万维网联盟在2000年8月制定的一种新的二维矢量图形格式,也是规范中的网格矢量图形标准,是一个开发的图形标准。

SVG格式的特点如下:

  • 基于XML
  • 采用文本来描述对象
  • 具有交互性和动态性
  • 完全支持DOM

SVG相对于GIF、JPEG格式的优势是,SVG是一种矢量图形格式,比GIF、JPEG等栅格格式具有众多优势,如文件小,对于网络而言,下载速度快;可任意缩放而不会破坏图像的清晰度和细节;图像中的文字独立于图像,文字保留可编辑和可搜寻的状态,也没有字体限制,用户系统即使没有安装某一种字体,也可看到与制作时完全相同的画面等。正是基于其格式的各种优点及开放性,SVG得到了众多组织和知名厂商的支持与认可,因此能够迅速地开发和推广应用。


概念解析

XML

Qt的XML模块支持两种XML解析方法:DOM和SAX。其中,DOM方法将XML文件表示为一棵树,以便随机访问其中的结点,但消耗内存相对多一些。而SAX是一种事件驱动的XML API,其速度快,但不便于随机访问任意结点。因此,通常根据实际应用选择合适的解析方法。这里只介绍DOM的使用方法。

文档对象模型(Document Object Model,DOM)是W3C开发的独立于平台和语言的接口,它可以使程序和脚本动态地存取和更新XML文档的内容、结构和风格。

DOM在内存中将XML文件表示为一棵树,用户通过API可以随意的访问数的任意结点内容。在Qt中,XML文档自身用QDomDocument表示,所有的结点类都从QDomNode继承。

SVG文件是利用XML表示的矢量图形文件,每种图形都用XML标签表示。例如,在SVG中画折线的标签如下:

<polyline fill="none" stroke="#888888" stroke-width="2" points="100,200,100,100"/>

其中

  • polyline:表示绘制折线
  • fill:表示填充
  • stroke:表示画笔颜色
  • stroke-width:表示画笔宽度
  • points:表示折线的点

Qt为SVG格式图片的显示与生成提供了专门的QtSvg模块,此模块中包含了与SVG图片相关的所有类,主要有QSvgWidgetQSvgRenderQGraphicsSvgItem

下面通过一个实例来介绍它的使用

一、运行结果


二、详细代码

在完成此功能的程序中使用与SVG相关的类,必须在程序中包含SVG相关的头文件:#include <QtSvg>

由于Qt默认生成的Makefile中只加入了QtGui、QtCore模块的库,所以必须在工程文件.pro中加入一行代码

QT += svg

svgwidget.h

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

svgwidget.cpp

#include "svgwidget.h"SvgWidget::SvgWidget(QWidget *parent): QSvgWidget(parent)
{render = renderer();
}void SvgWidget::wheelEvent(QWheelEvent *e)
{const double diff = 0.1;  //diff值表示每次滚轮滚动一定的值,图片大小改变的比例QSize size = render->defaultSize();  //用于获取图片显示区的尺寸int width = size.width();int height = size.height();if(e->delta() > 0)  //利用QWheelEvent的delta()函数获得滚轮滚动的距离值,通过此值来判断滚轮滚动的方向{//若delta()值大于零,则表示滚轮向前(远离用户的方向)滚动width = int(this->width() + this->width()*diff);height = int(this->height() + this->height()*diff);}else{//若delta()值小于零,则表示滚轮向后(靠近用户的方向)滚动width = int(this->width() - this->width()*diff);height = int(this->height() - this->height()*diff);}resize(width,height);
}

:鼠标滚动时间,滚轮每滚动1°相当于移动了8°,而常见的滚轮鼠标拨动一下滚动的角度为15°,因此滚轮拨动一下相当于移动了120(15*8)° 。

svgwindow.h

#ifndef SVGWINDOW_H
#define SVGWINDOW_H#include <QScrollArea>
#include "svgwidget.h"
#include <QMouseEvent>
#include <QScrollBar>class SvgWindow : public QScrollArea
{Q_OBJECT
public:SvgWindow(QWidget *parent = 0);void setFile(QString);void mousePressEvent(QMouseEvent *);void mouseMoveEvent(QMouseEvent *);private:SvgWidget *svgWidget;QPoint mousePressPos;QPoint scrollBarValuesOnMousePress;
};#endif // SVGWINDOW_H

svgwindow.cpp

#include "svgwindow.h"SvgWindow::SvgWindow(QWidget *parent): QScrollArea(parent)
{svgWidget = new SvgWidget;setWidget(svgWidget);
}void SvgWindow::setFile(QString fileName)
{svgWidget->load(fileName);QSvgRenderer *render = svgWidget->renderer();svgWidget->resize(render->defaultSize());
}void SvgWindow::mousePressEvent(QMouseEvent *event)
{mousePressPos = event->pos();scrollBarValuesOnMousePress.rx()=horizontalScrollBar()->value();scrollBarValuesOnMousePress.ry()=verticalScrollBar()->value();
}void SvgWindow::mouseMoveEvent(QMouseEvent *event)
{//对水平滚动条的新位置进行设置horizontalScrollBar()->setValue(scrollBarValuesOnMousePress.x() - event->pos().x() + mousePressPos.x());//对垂直滚动条的新位置进行设置verticalScrollBar()->setValue(scrollBarValuesOnMousePress.y() - event->pos().y() + mousePressPos.y());horizontalScrollBar()->update();event->accept();
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include "svgwindow.h"class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = 0);~MainWindow();void createMenu();public slots:void slotOpenFile();private:SvgWindow *svgWindow;
};#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include <QMenuBar>
#include <QMenu>
#include <QFileDialog>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
{setWindowTitle(tr("SVG Viewer"));createMenu();svgWindow = new SvgWindow;setCentralWidget(svgWindow);setMinimumSize(600,400);
}MainWindow::~MainWindow()
{}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);
}void MainWindow::slotOpenFile()
{QString name = QFileDialog::getOpenFileName(this,"打开","/","svg files(*.svg)");svgWindow->setFile(name);
}

学习QT之显示SVG格式图片相关推荐

  1. Qt QImage 显示TIFF格式图片

    一,需求 利用Qt 控件 显示 tiff 图片,由于tiff图像深度位96位,3通道,所以无法直接用QImage 显示,QImage 支持24位,因此需要利用Opencv 进行转换. 二,关键点 (1 ...

  2. Qt5开发从入门到精通——第六篇四节( 图像与图片——显示SVG格式图片 )

    欢迎小伙伴的点评✨✨,相互学习.互关必回.全天在线

  3. Qt显示wmf格式图片

    Qt显示wmf格式图片         夸平台的Qt不并不支持Auto CAD的输出图wmf.那么怎么才能在Qt下显示wmf格式图片呢?智能用win32 api了.具体过程下面一一介绍.        ...

  4. QT5开发及实例学习之十八显示Qt5 SVG格式图片

      SVG 的英文全称是 Scalable Vector Graphics,即可缩放的矢量图形.它是由万维网络联盟 ( World Wide Web Consortium, W3C ) 在 2000 ...

  5. OpenCasCade学习笔记(三):加载显示STEP格式图片,并实现平移、缩放和旋转操作

    OpenCasCade学习笔记(三):加载显示STEP格式图片,并实现平移.缩放和旋转操作 C3DWidget.h #pragma once#include <QtWidgets/QApplic ...

  6. svg上传服务器无法显示,让WordPress支持上传SVG格式图片并显示在媒体库中的方法...

    让WordPress支持上传SVG格式图片并显示在媒体库中的方法 发布时间:2020-12-11 14:18:12 来源:亿速云 阅读:167 作者:小新 这篇文章将为大家详细讲解有关让WordPre ...

  7. element适配svg格式图片

    SVG格式图片的配置 名词解释: svg是可缩放矢量图形,顾名思义就是任意改变其大小也不会变形,基于可扩展标记语言(xml),他严格遵守XML语法,并用文本格式的描述性语言来描述图像内容.用户可以直接 ...

  8. 01.使用.svg格式图片生成app图标详细步骤和注意事项

    Android8.0之后引入了矢量图标,可以支持动态特效,在不同安卓版本上可以相对应的显示圆形.方形圆角,方形图标 需要两张.svg格式的图片,一张前景图,一张背景图,分别命名为ic_launcher ...

  9. 【数字图像处理】一.MFC详解显示BMP格式图片

    本文主要是讲述<数字图像处理>系列栏目中的第一篇文章.主要详细介绍了BMP图片格式,同时使用C++和MFC显示BMP格式,主要结合自己的<数字图像处理>课程和以前的项目叙述讲解 ...

最新文章

  1. 最小割 ---- 集合冲突模型 ---- AGC038 F - Two Permutations[详解]
  2. 马斯克即将解锁海上发射!SpaceX海洋太空港最早明年可投入使用
  3. 血泪史:阿里云+ubuntu+vnc+xfce4
  4. Tomcat 中文乱码 设置UTF-8编码 问题解决办法
  5. 知道这些面试技巧,让你的测试求职少走弯路
  6. leetcode84. 柱状图中最大的矩形
  7. background-size 兼容ie8以下浏览器的方法
  8. insertAdjacentHTML方法:在指定的地方插入html标签语句
  9. 2017.3.25 最长递增子序列 失败总结
  10. MinGW-w64离线安装包,环境配置(Windows)
  11. UBuntu CMake工程配置基础
  12. 【三维路径规划】基于matlab粒子群算法无人机三维路径规划【含Matlab源码 015期】
  13. 一个很好用的桌面取色器和一个在线取色器
  14. 零基础如何入门数学建模?
  15. 计算机组装与维护参考文献,计算机的组装与维护毕业论文.doc
  16. 5G时代对IDC数据中心提出了怎样的要求?
  17. .\Fire_FreeRTOS.axf: Error: L6221E: Execution region ER_RO with Execution range [0x00000000,0x000001
  18. 何为Agile,何为Scrum
  19. tomcat定时自动重启设置方法
  20. stm32 刹车 功能

热门文章

  1. hive函数使用(校验日期连续性)
  2. 【转载】深入理解L1、L2范数
  3. Spring Boot 实践折腾记(15):使用Groovy
  4. 优秀的领导都是坏人!(经典)
  5. 动态规划解决数字三角形
  6. 美图影像Topic推荐-AMiner
  7. python撤销快捷键-汇总学习Python必备的42个快捷键,看完收获满满
  8. [转]为了父母, 你需要知道患了中风该怎么做?
  9. 南北桥的作用一功能和特点
  10. 小敏同学利用计算机设计,2015-2016学年上学期七年级期中考试数学试题(新北师大版)及答案...