qt svg文件的读取和保存

可缩放矢量图形(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函数。

  1. SVG图形可以在构造QSvgRenderer时加载,也可以稍后使用load()函数加载。

  1. 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"));

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt提供了QSvgRenderer类,可以用来渲染SVG文件,并且可以获取SVG文件中的属性。 以下是一个示例代码,演示如何修改SVG文件的属性: ```cpp #include <QApplication> #include <QSvgRenderer> #include <QSvgGenerator> #include <QPainter> int main(int argc, char *argv[]) { QApplication a(argc, argv); // 加载SVG文件 QSvgRenderer renderer(QStringLiteral(":/test.svg")); if (!renderer.isValid()) { qWarning("Failed to load SVG file"); return 1; } // 获取SVG文件中的属性 QSize size = renderer.defaultSize(); // 修改SVG文件中的属性 size.setWidth(size.width() * 2); size.setHeight(size.height() * 2); // 生成新的SVG文件 QSvgGenerator generator; generator.setFileName(QStringLiteral("new_test.svg")); generator.setSize(size); generator.setViewBox(QRect(QPoint(0, 0), size)); generator.setTitle(QStringLiteral("New Test SVG")); generator.setDescription(QStringLiteral("This is a new test SVG file")); // 渲染SVG文件 QPainter painter; painter.begin(&generator); renderer.render(&painter); painter.end(); return 0; } ``` 在上面的代码中,首先使用QSvgRenderer类加载SVG文件,然后获取SVG文件中的属性。接着,修改SVG文件中的属性,例如将宽度和高度都乘以2。然后,创建一个新的QSvgGenerator对象,设置SVG文件的属性,例如文件名、大小、视图框、标题和描述。最后,使用QPainter类将SVG文件渲染到新的SVG文件中。 请注意,如果你要修改SVG文件中的属性,例如颜色、字体等等,需要在渲染之前修改。因为QSvgRenderer类不会修改SVG文件本身,而是在渲染时根据SVG文件中的属性进行渲染。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值