zoukankan      html  css  js  c++  java
  • Qt使用QPainter绘制矢量图并保存为svg文件

    位图和矢量图:

    Bitmap:

    • Usually a larger file size
    • Cannot be enlarged into a higher resolution as the image quality will be affected
    • Used to display complex images with many colors, such as photographs

    Vector:

    • Very small in file size
    • Graphics can be resized without affecting the image quality
    • Only a limited amount of color can be applied to each shape (single color, gradient, or pattern)
    • Complex shapes require high-processing power to be generated

    新建基于Widget的应用程序,继承于QMainWindow

     MainWindow.h
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H

    #include <QMainWindow>
    #include <QPainter>
    #include <QMenuBar>
    #include <QtSvg/QSvgGenerator>
    #include <QFileDialog>


    class MainWindow : public QMainWindow
    {
        Q_OBJECT


    public:
        MainWindow(QWidget *parent = 
    0);
        ~MainWindow();

        
    virtual void paintEvent(QPaintEvent *event);

    public slots:
        
    void actionSaveAsSVG();

    private:
        
    void paintAll(QSvgGenerator *generator = nullptr);
    };

    #endif // MAINWINDOW_H
     MainWindow.cpp
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
    #include "MainWindow.h"

    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
    {
        QMenu *fileMenu = menuBar()->addMenu(QObject::tr(
    "&File"));
        fileMenu->addAction(QObject::tr(
    "Save As Svg"), this, &MainWindow::actionSaveAsSVG);
    }

    MainWindow::~MainWindow()
    {

    }

    void MainWindow::paintEvent(QPaintEvent *event)
    {
        paintAll();
    }

    void MainWindow::actionSaveAsSVG()
    {
        QString filePath = QFileDialog::getSaveFileName(
    this"Save SVG",

                                                        
    """SVG files (*.svg)");
        
    if (filePath == "")
            
    return;
        QSvgGenerator generator;
        generator.setFileName(filePath);
        generator.setSize(QSize(
    this->width(), this->height()));
        generator.setViewBox(QRect(
    00this->width(), this->height()));
        generator.setTitle(
    "SVG Example");
        generator.setDescription(
    "This SVG file is generated by Qt.");
        paintAll(&generator);
    }

    void MainWindow::paintAll(QSvgGenerator *generator)
    {
        QPainter painter;
        
    if (generator)
            painter.begin(generator);
        
    else
            painter.begin(
    this);

        
    // Draw Text
        painter.setFont(QFont("Times"14, QFont::Bold));
        painter.drawText(QPoint(
    2040), "Hello Qt");
        
    // Draw Line
        painter.drawLine(QPoint(5070), QPoint(100100));
        
    // Draw Rectangle
        painter.setBrush(Qt::BDiagPattern);
        painter.drawRect(QRect(
    401208030));
        
    // Draw Ellipse
        QPen ellipsePen;
        ellipsePen.setColor(Qt::red);
        ellipsePen.setStyle(Qt::DashDotLine);
        painter.setPen(ellipsePen);
        painter.drawEllipse(QPoint(
    80200), 5020);
        
    // Draw Rectangle
        QPainterPath rectPath;
        rectPath.addRect(QRect(
    1503010050));
        painter.setPen(QPen(Qt::red, 
    1, Qt::DashDotLine, Qt::FlatCap,
                            Qt::MiterJoin));
        painter.setBrush(Qt::yellow);
        painter.drawPath(rectPath);
        
    // Draw Ellipse
        QPainterPath ellipsePath;
        ellipsePath.addEllipse(QPoint(
    200120), 5020);
        painter.setPen(QPen(QColor(
    7910625), 5, Qt::SolidLine,
                            Qt::FlatCap, Qt::MiterJoin));
        painter.setBrush(QColor(
    12216339));
        painter.drawPath(ellipsePath);
        painter.end();
    }

     Main.cpp
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include "MainWindow.h"
    #include <QApplication>

    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);

        MainWindow w;
        w.resize(
    640480);
        w.show();

        
    return a.exec();
    }

    编译运行

    另存为svg文件

  • 相关阅读:
    Http请求头和相应头分析
    linux扩充容量经典篇
    Redis持久化以及其原理
    redis简单应用
    Python Requests库使用2:请求方法
    加快访问GitHub的速度
    GET和POST两种基本请求方法的区别
    Python Requests库介绍
    Python urllib、urllib2、urllib3用法及区别
    Django中操作cookie和session
  • 原文地址:https://www.cnblogs.com/MakeView660/p/10817733.html
Copyright © 2011-2022 走看看