Custom QDialog with a QGraphicsView helps to visualize QGraphicsItems that are included in a QGraphicsScene. By using addItem() function of QGraphicsScene, custom QGraphicsItems can be added to the QGraphicsScene instance. QGprahicsItem binary data such as x() and y() coordinates can be serialized to a QFile by using QDataStream.
Sample project started as a QT Gui Application and contains main.cpp, SceneToDataStream.h, SceneToDataStream.cpp, MyGraphicsItem.h and MyGraphicsItem.cpp files.
Project Directory Structure in Qt Creator IDE :

SceneToDataStream.pro is the project configuration file and contains:
QT += core gui
TARGET = SceneToDataStream
TEMPLATE = app
SOURCES += main.cpp\
SceneToDataStream.cpp \
MyGraphicsItem.cpp
HEADERS += SceneToDataStream.h \
MyGraphicsItem.h
main.cpp file contains the custom QDialog instance and shows it.
#include <QApplication>
#include "SceneToDataStream.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Dialog w;
w.show();
return a.exec();
}
SceneToDataStream.h file is the extended QDialog class header file.
#ifndef SCENETODATASTREAM_H
#define SCENETODATASTREAM_H
#include <QDialog>
class QGraphicsScene;
class MyGraphicsItem;
class QGraphicsView;
class QVBoxLayout;
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = 0);
~Dialog();
public slots:
void sl_saveSceneToFile();
private:
QGraphicsScene* scene;
MyGraphicsItem* item;
QGraphicsView* view;
QVBoxLayout* layout;
QPushButton* btnSave;
};
#endif // SCENETODATASTREAM_H
SceneToDataStream.cpp file contains implementation details for extended QDialog class.
#include "SceneToDataStream.h"
#include "MyGraphicsItem.h"
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QVBoxLayout>
#include <QPushButton>
#include <QFile>
#include <QList>
#include <QMessageBox>
#include <QDir>
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
{
scene = new QGraphicsScene(this);
item = new MyGraphicsItem();
item->setPos(34,35);
scene->addItem(item);
view = new QGraphicsView(scene,this);
layout = new QVBoxLayout(this);
layout->addWidget(view);
btnSave = new QPushButton("Save Scene To File");
connect(btnSave, SIGNAL(clicked()), this, SLOT(sl_saveSceneToFile()));
layout->addWidget(btnSave);
setLayout(layout);
resize(270,200);
}
Dialog::~Dialog()
{
delete btnSave;
delete layout;
delete item;
delete scene;
delete view;
}
void Dialog::sl_saveSceneToFile()
{
QString fileName = QDir::currentPath().append("/sceneData.txt");
QFile file(fileName);
if (!file.open(QIODevice::WriteOnly))
{
return;
}
QDataStream out(&file);
QList<QGraphicsItem*> itemList = scene->items();
int itemListSize = itemList.size();
out << itemListSize;
foreach( QGraphicsItem* item, itemList)
{
out << item->x();
out << item->y();
}
QMessageBox::warning(this,"Success","Saved Scene Data to File");
close();
}
sl_saveSceneToFile() slot of Dialog class is connected to QPushButton clicked signal and serializes number of all the items on the scene with item x() and y() coordinates respectively.
MyGraphicsItem is a derived custom QGraphicsItem class that implements boundingRect() and paint() functions of the parent. MyGraphicsItem is a rectangular derived QGraphicsItem and added to the QGraphicsScene.
MyGraphicsItem.h file contains custom QGraphicsItem class declaration.
#ifndef MYGRAPHICSITEM_H
#define MYGRAPHICSITEM_H
#include <QGraphicsItem>
class MyGraphicsItem : public QGraphicsItem
{
public:
MyGraphicsItem(QGraphicsItem *parent = 0, QGraphicsScene *scene = 0);
~MyGraphicsItem();
protected:
QRectF boundingRect() const;
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
QWidget *widget);
};
#endif // MYGRAPHICSITEM_H
MyGraphicsItem.cpp file contains implementation details for custom QGraphicsItem class.
#include "MyGraphicsItem.h"
#include <QPainter>
MyGraphicsItem::MyGraphicsItem(QGraphicsItem* parent, QGraphicsScene* scene) : QGraphicsItem(parent,scene)
{
}
MyGraphicsItem::~MyGraphicsItem(){}
QRectF MyGraphicsItem::boundingRect() const
{
qreal penWidth = 1;
return QRectF(-10 - penWidth / 2, -10 - penWidth / 2,
20 + penWidth, 20 + penWidth);
}
void MyGraphicsItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
QWidget *widget)
{
Q_UNUSED(widget)
Q_UNUSED(option)
QPen pen;
pen.setWidthF(2);
pen.setStyle(Qt::DashLine);
painter->setPen(pen);
painter->setBrush(QBrush(QColor(50,120,80)));
painter->drawRoundedRect(boundingRect(), 25, 25, Qt::RelativeSize);
}
sceneData.txt is the produced file that contains serialized binary data.





