Mithilfe der Qt-Bibliothek können Sie den Inhalt der Grafikszene QGraphicsScene in Vektorgrafiken im SVG-Format speichern, die sich dann problemlos in Editoren öffnen lassen wie CorelDraw. Ich schlage vor, eine kleine Anwendung zu schreiben, die den Inhalt der Grafikszene in einer SVG-Datei speichert und sie dann mit CorelDraw öffnet.
Projektstruktur
- SvgExample.pro - Projektprofil;
- mainwindow.h - Header-Datei des Hauptanwendungsfensters;
- mainwindow.cpp - Quellcodedatei des Hauptfensters der Anwendung, in der alle Aktionen stattfinden;
- mainwindow.ui - Formulardatei des Hauptanwendungsfensters;
- main.cpp - Hauptstartquelldatei.
mainwindow.ui
Lassen Sie uns im Schnittstellendesigner eine Schaltfläche skizzieren, die ein Dialogfeld öffnet, in dem wir den Pfad zum Speichern der SVG-Datei auswählen. Und stellen Sie auch das Widget QGraphicsView, ein, in dem die Grafikszene platziert wird.
SVGBeispiel.pro
Im Projektprofil muss zwingend das Modul SVG eingebunden werden, um mit Vektorgrafik-Klassen arbeiten zu können.
#------------------------------------------------- # # Project created by QtCreator 2016-03-09T23:52:59 # #------------------------------------------------- QT += core gui svg greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = SvgExample TEMPLATE = app SOURCES += main.cpp\ mainwindow.cpp HEADERS += mainwindow.h FORMS += mainwindow.ui
main.cpp
Die Datei bleibt unverändert.
#include "mainwindow.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); }
Hauptfenster.h
Daher werden wir in die Header-Datei des Hauptanwendungsfensters die Bibliotheken QGraphicsScene , QGraphicsRectItem, QSvgGenerator, QFileDialog und QPainter aufnehmen .
Auf der Grafik werden zwei Rechtecke erstellt, die in einer SVG-Datei gespeichert werden müssen. Das Speichern erfolgt im Verarbeitungsschlitz des Schaltflächenklicks, der ein Dialogfeld zur Auswahl des Pfads zum Speichern der SVG-Datei aufruft .
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QGraphicsScene> #include <QGraphicsRectItem> #include <QSvgGenerator> #include <QFileDialog> #include <QPainter> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private slots: void on_saveButton_clicked(); private: Ui::MainWindow *ui; QGraphicsScene *scene; // Графическая сцена QString path; // Путь сохранения файла }; #endif // MAINWINDOW_H
Hauptfenster.cpp
Um Dienstparameter einzustellen und Grafikobjekte aus der Grafikszene zu zeichnen, wird ein Objekt der Klasse QSvgGenerator verwendet, aber um Daten zu übertragen und direkt auf dieses Objekt zu zeichnen, wird ein Objekt der Klasse QPainter verwendet, in das die target-Objekt gesetzt, in dem das Zeichnen mit der Methode begin(), ausgeführt wird, und das Zeichenziel ist das QSvgGenerator-Klassenobjekt selbst. Das Zeichnen wird mit render(), ausgeführt. Methode der grafischen Szene durch QPainter.
#include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); scene = new QGraphicsScene(); ui->graphicsView->setScene(scene); scene->setSceneRect(0,0,400,400); // Создаём первый красный прямоугольник на графической сцене QGraphicsRectItem *rect1 = new QGraphicsRectItem(); rect1->setRect(10,50,100,50); rect1->setBrush(QBrush(Qt::red)); rect1->setPen(QPen(QBrush(Qt::black),2)); scene->addItem(rect1); // И создаём второй синий прямоугольник на графической сцене QGraphicsRectItem *rect2 = new QGraphicsRectItem(); rect2->setRect(150,100,115,75); rect2->setBrush(QBrush(Qt::blue)); rect2->setPen(QPen(QBrush(Qt::black),2)); scene->addItem(rect2); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_saveButton_clicked() { // Заберём путь к файлу и его имененем, который будем создавать QString newPath = QFileDialog::getSaveFileName(this, trUtf8("Save SVG"), path, tr("SVG files (*.svg)")); if (newPath.isEmpty()) return; path = newPath; QSvgGenerator generator; // Создаём объект генератора файла generator.setFileName(path); // Устанавливаем путь к файлу, куда будет сохраняться векторная графика generator.setSize(QSize(scene->width(), scene->height())); // Устанавливаем размеры рабочей области документа в миллиметрах generator.setViewBox(QRect(0, 0, scene->width(), scene->height())); // Устанавливаем рабочую область в координатах generator.setTitle(trUtf8("SVG Example")); // Титульное название документа generator.setDescription(trUtf8("File created by SVG Example")); // Описание документа // С помощью класса QPainter QPainter painter; painter.begin(&generator); // Устанавливаем устройство/объект в котором будем производить отрисовку scene->render(&painter); // Отрисовываем содержимое сцены с помощью painter в целевое устройство/объект painter.end(); // Заканчиваем отрисовку // По окончанию отрисовки получим векторный файл с содержимым графической сцены }
Insgesamt
Als Ergebnis der Ausführung dieses Programmcodes erhalten Sie eine SVG-Datei, die sich erfolgreich in CorelDraw öffnen lässt.
Добрый вечер. Встал вопрос. Каким образом сохранить координаты объектов, потому что в следующем уроке объекты на сцене будут находиться все в одном месте из которого их еще придется перетаскивать
Координаты объектов в данном случае нормально сохраняются. В конце статьи есть урок по восстановлению данных из SVG файла, изучите его. Там показано, как расположить объекты на графической сцене во время восстановления данных.
Здравствуйте!
Как можно добавить текст туда?
Хочу попробовать нарисовать граф и обозначить вершины с дугами.
Добрый день.
Текст можно добавить на графическубюю сцену с помощью QGraphicsTextItem.
Добрый день!
А не подскажете как можно сохранить фон, если это моя собственная картинка? При сохранении просто однотонного фона, не картинки все работает хорошо.
Добрый день.
Не подскажу. Могу только направить. Для это нужно в каком-нибудь популярном svg редакторе смотреть, как будет сохраняться ихображение, и потом попытаться повторить тоже самое средствами Qt.
Вполне возможно, что изображение там или отдельно будет сохраняться или будет как-то встраиваться в SVG файл.