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文件
希望大家能把自己的所学和他人一起分享,不要去鄙视别人索取时的贪婪,因为最应该被鄙视的是不肯分享时的吝啬。