可缩放矢量图形(SVG)是一种用XML描述二维图形和图形应用的语言。
Qt SVG提供了用于呈现SVG文件的类。要包含模块类的定义
#include <QtSvg>
要链接到模块,请将此行添加到qmake.pro文件中:QT += svg
允许在Qt支持的所有绘画设备上呈现SVG文件,包括QWidget、QGLWidget和QImage。
Qt提供了用于在小部件和其他绘制设备中呈现和显示SVG图形的类。
QGraphicsSvgItem
QGraphicsItem,可用于呈现SVG文件的内容,可以细化拆分Svg的元素。QGraphicsSvgItem类是一个QGraphicsItem的子类,可以在QGraphicsView显示svg文件。
QGraphicsSvgItem可以通过将要呈现的SVG文件传递给其构造函数或通过在其上显式设置共享的QSvgRenderer来创建。
void Widget::readbuttonslot()
{
QString filePath = QFileDialog::getOpenFileName(0, "打开文件", ".", "SVG(*.svg)");
if(filePath.isEmpty())
{
return;
}
QSvgRenderer *renderer = new QSvgRenderer(filePath);
QGraphicsSvgItem *blackSvgItem = new QGraphicsSvgItem();
blackSvgItem->setSharedRenderer(renderer);
m_scene->addItem(blackSvgItem);
blackSvgItem->setFlags (QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
}
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
m_scene = new MyGraphicsScene;
m_view = new QGraphicsView(this);
m_view->setScene(m_scene);
m_view->setGeometry(500,100,300,600);
m_view->setAcceptDrops(true);
m_view->show();
QPushButton *pReadbutton = new QPushButton(tr("加载svg"),this);
pReadbutton->setGeometry(10,height()-50,60,40);
connect(pReadbutton,SIGNAL(clicked()),this,SLOT(readbuttonslot()));
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = nullptr);
~Widget();
MyGraphicsScene * m_scene;
QGraphicsView *m_view;
private:
Ui::Widget *ui;
protected:
void paintEvent(QPaintEvent *event);
QSvgRenderer* svgRender;
public slots:
void readbuttonslot();
void writebuttonslot();
};
QSvgGenerator
用于创建SVG图形的绘制设备,主要用于保存的时候使用,注意保存到时候直接使用局部变量即可,使用全局变量其没有析构反倒不会保存。
要编写SVG文件,首先需要通过设置文件名或outputDevice属性来配置输出。通常需要通过设置“大小”特性来指定图形的大小,在某些情况下,如果图形将包含在另一个图形中,则还需要设置“viewBox”特性。其他元数据可以通过设置标题、描述和分辨率属性来指定。与其他QPaintDevice子类一样,QPainter对象用于绘制此类的实例。// 无需在paintEvent函数中。相当于把paintevent画图导出保存成svg文件。
QPainter painter;
painter.begin(&generator);
// 此处绘制的内容就是保存为svg文件的内容
painter.end();
void Widget::writebuttonslot()
{
QString filePath = QFileDialog::getSaveFileName(0, "打开文件", ".", "SVG(*.svg)");
if(filePath.isEmpty())
{
return;
}
QSvgGenerator svgGenerator;
svgGenerator.setFileName(filePath);
svgGenerator.setSize(QSize(rect().width(), rect().height()));
svgGenerator.setViewBox(rect()); svgGenerator.setTitle("测试QSvgGenerator");
svgGenerator.setDescription("另存为绘制测试");
QPainter painter;
painter.begin(&svgGenerator);
painter.setPen(Qt::red);
painter.drawLine(QPointF(20,20),QPointF(100,100));
painter.drawText(rect(), "测试Svg");
QPixmap pixmap = this->grab(QRect(0, 0, 1000, 800));
painter.drawPixmap(10,10,pixmap);
painter.end();
}
QPushButton *pWritebutton = new QPushButton(tr("保存svg"),this);
pWritebutton->setGeometry(100,height()-50,60,40);
connect(pWritebutton,SIGNAL(clicked()),this,SLOT(writebuttonslot()));
QSvgRenderer
用于将SVG文件的内容绘制到绘图设备上,其是打开svg将其渲染到QPixmap等上面。使用QSvgRenderer,可缩放矢量图形(SVG)可以呈现到任何QPaintDevice子类上,包括QWidget、QImage和QGLWidget。
一般用于QWidget的PaintEvent函数。
SVG图形可以在构造QSvgRenderer时加载,也可以稍后使用load()函数加载。
QWidget的PaintEvent函数上,QSvgRenderer对象调用render函数展示svg图形。
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
svgRender = new QSvgRenderer(this);
bool ret = svgRender->load(QString("G:/opencode/qt/msvc/test/drag/arrow.svg"));
}
void Widget::paintEvent(QPaintEvent *event)
{
QPainter p(this);
svgRender->render(&p,QRectF(0,0,100,100));
}
QSvgWidget
用于显示可缩放矢量图形(SVG)文件内容的小部件,直接加载svg文件,即可显示
将SVG图形与标准小部件一起显示,并且使用的方式与QLabel用于显示文本和位图图像的方式基本相同。
#include <QWidget>
#include <QSvgWidget>
#include <QSvgRenderer>
class MySvgWidget :public QWidget
{
Q_OBJECT
public:
MySvgWidget(QWidget *parent = 0);
~MySvgWidget();
QString filePath;
QSvgWidget *pSvgWidget;
QSvgRenderer *pSvgRenderer;
void load(const QString &strfile);
};
#include "MySvgWidget.h"
MySvgWidget::MySvgWidget(QWidget *parent):
QWidget(parent)
{
pSvgWidget = new QSvgWidget(this);
pSvgRenderer = pSvgWidget->renderer();
}
MySvgWidget::~MySvgWidget()
{
}
void MySvgWidget::load(const QString &strfile)
{
pSvgWidget->load(strfile);
pSvgWidget->repaint();
update();
}
MySvgWidget *psvgwidget;
psvgwidget = new MySvgWidget(this);
psvgwidget->setGeometry(200,0,200,200);
psvgwidget->show();
psvgwidget->load(QString("G:/opencode/qt/msvc/test/drag/arrow.svg"));