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

posted @ 2024-06-16 03:45  蜡笔小新Pointer  阅读(65)  评论(0)    收藏  举报