Project Directory Structure in Qt Creator IDE :
SaveQGraphicsSceneAsImage.pro is the project configuration file and contains:
QT += core gui TARGET = SaveQGraphicsSceneAsImage TEMPLATE = app SOURCES += main.cpp\ Dialog.cpp HEADERS += Dialog.h
main.cpp file contains the custom QDialog instance and shows it.
#include <QApplication> #include "Dialog.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); Dialog w; w.show(); return a.exec(); }
Dialog.h file contains custom QDialog interface.
#ifndef DIALOG_H #define DIALOG_H #include <QDialog> class QGraphicsScene; class QGraphicsView; class QVBoxLayout; class Dialog : public QDialog { Q_OBJECT public: Dialog(QWidget *parent = 0); ~Dialog(); public slots: void sl_saveSceneAsImage(); private: QGraphicsScene* scene; QGraphicsView* view; QVBoxLayout* layout; QPushButton* btnSaveScene; }; #endif // DIALOG_H
Dialog.cpp file contains implementation details for the custom QDialog.
#include "Dialog.h" #include <QGraphicsView> #include <QGraphicsScene> #include <QVBoxLayout> #include <QPushButton> #include <QString> #include <QFileDialog> #include <QPixmap> Dialog::Dialog(QWidget *parent) : QDialog(parent) { scene = new QGraphicsScene(this); scene->addEllipse(22,3,12,13,QPen(QColor("red"))); scene->addLine(1,2,8,9,QPen("blue")); scene->addRect(12,12,6,7,QPen("green")); view = new QGraphicsView(scene,this); layout = new QVBoxLayout(this); btnSaveScene = new QPushButton("Take Scene SnapShot"); connect(btnSaveScene, SIGNAL(clicked()), this, SLOT(sl_saveSceneAsImage())); layout->addWidget(view); layout->addWidget(btnSaveScene); setLayout(layout); resize(270,200); } Dialog::~Dialog() { delete btnSaveScene; delete scene; delete view; delete layout; } void Dialog::sl_saveSceneAsImage() { QString fileName = QFileDialog::getSaveFileName(this, "Save Scene", "", "Image (*.png)"); QPixmap pixMap = QPixmap::grabWidget(view); pixMap.save(fileName); close(); }
QGraphicsScene content can be saved as a png image file. Sample QGraphicsScene contains items of type line,rectangle and ellipse. Taken snapshot displays all these items inside of saved snapshot.
sl_saveSceneAsImage() slot of custom QDialog uses Qpixmap::grabWidget function to create a pixmap and paints the QGraphicsView inside it. Because all the child items are also painted in then QGraphicsScene becomes painted inside snapshot, too.
As a result Qpixmap instance is saved to specified location with :
pixMap.save(fileName);
Sample QGraphicsScene content :
Saved QGraphicsScene Snapshot :
No comments:
Post a Comment