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(
0 0 this ->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(
20 40 ),  "Hello Qt" );
    
// Draw Line
    painter.drawLine(QPoint( 50 70 ), QPoint( 100 100 ));
    
// Draw Rectangle
    painter.setBrush(Qt::BDiagPattern);
    painter.drawRect(QRect(
40 120 80 30 ));
    
// Draw Ellipse
    QPen ellipsePen;
    ellipsePen.setColor(Qt::red);
    ellipsePen.setStyle(Qt::DashDotLine);
    painter.setPen(ellipsePen);
    painter.drawEllipse(QPoint(
80 200 ),  50 20 );
    
// Draw Rectangle
    QPainterPath rectPath;
    rectPath.addRect(QRect(
150 30 100 50 ));
    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(
200 120 ),  50 20 );
    painter.setPen(QPen(QColor(
79 106 25 ),  5 , Qt::SolidLine,
                        Qt::FlatCap, Qt::MiterJoin));
    painter.setBrush(QColor(
122 163 39 ));
    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(
640 480 );
    w.show();

    
return  a.exec();
}

编译运行

另存为svg文件

猜你喜欢

转载自www.cnblogs.com/MakeView660/p/10817733.html