6.4 显示SVG格式的图片
6.4 显示SVG格式的图片
SVG的全称是(Scalable Vector Graphics),即可以缩放的矢量图形,这种图形不像png或jpeg这种格式的图片在放大后会失真,反之SVG的图片由于是通过向量来存储的图片的信息,因此这种图片在放大时,不会失真(可以说,越放大越清晰),所以说,我们可以思考,SVG的格式不能像png或jpg的格式那样子通过RGB来存储图片的这些像素信息,言外之意就是说,这种格式可能会是一种文本格式的图片(只不过需要用专门的解析规则来解析它)。但事实确实如此,SVG格式的重要特征如下:
(1)基于XML(实际上XML也是一种文本的格式,和JSON格式类似,有异曲同工之妙)
(2)采用文本的格式来描述对象
(3)具有交互性和动态性
(4)完全支持DOM组件
6.4.1 案例,使用QSvgXXX相关的类(实际上就是SVG相关的模块)来解析并显示SVG格式的图片
Qt中提供了一些专门用于解析或生成SVG格式的图片的,我们可以使用它们来打开并解析SVG格式的图片。
QSvgRenderer,QSvgGenerator,QSvgWidget,QGraphicsSvgItem
(1)新建Qt GUI程序,项目名称为SVGTest,基类选择QMainWindow,类名为MainWindow,取消"创建ui界面的"复选框。
(2)添加一个C++类,这个类我们将继承自QSvgWidget,用于显示或处理SVG图片的窗口,类名就命名为SvgWidget即可。
(3)我们需要在SVGTest.pro文件中添加SVG模块,写上QT += svg
(4)在SvgWidget中的声明和实现里面分别加入以下内容
#ifndef SVGWIDGET_H
#define SVGWIDGET_H
#include <QObject>
#include <QSvgRenderer>
#include <QWheelEvent>
#include <QSvgWidget>
#include <QDebug>
class SvgWidget:public QSvgWidget
{
Q_OBJECT
public:
explicit SvgWidget(QWidget*parent = nullptr);
~SvgWidget()override;
public:
void wheelEvent(QWheelEvent*event)override;//滑鼠的滚球滚动事件,用于缩放图片
private:
QSvgRenderer*m_render;
};
#endif // SVGWIDGET_H
#include "svgwidget.h"
SvgWidget::SvgWidget(QWidget*parent)
{
m_render = new QSvgRenderer;
}
SvgWidget::~SvgWidget()
{
}
void SvgWidget::wheelEvent(QWheelEvent *event)
{
const double diff(0.1);//放大的比例因子
QSize size = m_render->defaultSize();
int width = size.width();
int height = size.height();
if(event->delta()>0)//delta函数所返回的值若大于0,则说明滚轮向前滚动,否则向后滚动
{
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(width,height);
}
(5)新建C++类,类名为SvgWindow,这个类主要是一个带滚动条的显示区域,在SvgWindow中包含SvgWidget的头文件,当图片放大到超过主窗口的大小时,能够通过拖动滚动条进行查看。
#ifndef SVGWINDOW_H
#define SVGWINDOW_H
#include <QObject>
#include <QScrollArea>
#include <QScrollBar>
#include <QMouseEvent>
#include "svgwidget.h"
class SvgWindow:public QScrollArea
{
Q_OBJECT
public:
explicit SvgWindow(QWidget*parent = nullptr);
~SvgWindow();
public:
void setFile(QString);
void mousePressEvent(QMouseEvent*event);
void mouseMoveEvent(QMouseEvent*event);
private:
SvgWidget*m_svgWidget;
QPoint m_mousePressPos;
QPoint m_scrollBarValuesOnMousePress;
};
#endif // SVGWINDOW_H
#include "svgwindow.h"
SvgWindow::SvgWindow(QWidget*parent)
{
m_svgWidget = new SvgWidget;
setWidget(m_svgWidget);
}
SvgWindow::~SvgWindow()
{
}
void SvgWindow::setFile(QString fileName)
{
m_svgWidget->load(fileName);
QSvgRenderer*render = m_svgWidget->renderer();
m_svgWidget->resize(render->defaultSize());
}
void SvgWindow::mousePressEvent(QMouseEvent *event)
{
m_mousePressPos = event->pos();//获得按下鼠标时,鼠标的坐标
m_scrollBarValuesOnMousePress.rx() = horizontalScrollBar()->value();//获得按下鼠标时,水平滚动条的坐标值x
m_scrollBarValuesOnMousePress.ry() = verticalScrollBar()->value();//获得按下鼠标时,垂直滚动条的坐标轴值y
event->accept();
}
void SvgWindow::mouseMoveEvent(QMouseEvent *event)
{
//通过当鼠标按下并拖动鼠标时,设置滚动条的位置来实现拖动图片的效果
horizontalScrollBar()->setValue(m_scrollBarValuesOnMousePress.x()-event->pos().x()+m_mousePressPos.x());
verticalScrollBar()->setValue(m_scrollBarValuesOnMousePress.y()-event->pos().y()+m_mousePressPos.y());
horizontalScrollBar()->update();
verticalScrollBar()->update();
event->accept();
}

本节代码:https://files.cnblogs.com/files/blogs/792763/SVGTest.zip?t=1718480688&download=true

浙公网安备 33010602011771号