===== Uložení dat ve formátu JSON =====
Pro komunikaci s programy v JavaScriptu se hodí formát JSON.
http://en.wikipedia.org/wiki/JSON \\
http://www.json.org/json-cz.html
Přiklad našich dat:
{
"name": "block",
"type": "rectangle",
"x": 97,
"y": 27,
"width": 200,
"height": 160,
"pen": "#ffa500",
"brush": "#ffff00",
"items":
[
{
"name": "item1",
"brush": "#6495ed",
"x": 40,
"y": 40,
"height": 40
},
{
"name": "item2",
"brush": "#6495ed",
"x": 120,
"y": 40
}
]
}
Soubor **jsonio.cc** \\
http://gitlab.fjfi.cvut.cz/culikzde/sos/-/blob/master/graphics04/jsonio.cc
Qt od verze 5 poskytují třídy pro práci s tímto formátem.
#include
#include
#include
Při zápisu grafického prvku si vytvoříme proměnou typu **QJsonObject** (bez ukazatele). \\
//Objekt se bude v JSONu zapisovat ve složených závorkách.//
Tento objekt má předefinované **[ ]**, \\
jako //"index"// používáme názvy položek, které se objeví v JSONu před dvojtečkou \\
a odpovídající hodnoty přiřazujeme do objektu jako do pole.
//Pole/seznam se v JSONu zapisuje v hranatých závorkách.// \\
V našem programu ho vytvoříme pomocí **QJsonArray** a metody **append** a vložíme do něj vnořené grafické prvky.
QJsonObject writeItem (QGraphicsItem * item)
{
QJsonObject obj;
obj ["type"] = itemType (item);
obj ["name"] = item->toolTip ();
obj ["x"] = item->x();
obj ["y"] = item->y();
if (QAbstractGraphicsShapeItem * shape = dynamic_cast < QAbstractGraphicsShapeItem * > (item))
{
obj ["pen"] = penToString (shape->pen());
obj ["brush"] = brushToString (shape->brush());
if (QGraphicsRectItem * e = dynamic_cast < QGraphicsRectItem * > (shape))
{
obj ["width"] = e->rect().width();
obj ["height"] = e->rect().height();
}
if (QGraphicsEllipseItem * e = dynamic_cast < QGraphicsEllipseItem * > (shape))
{
obj ["width"] = e->rect().width();
obj ["height"] = e->rect().height();
}
if (QGraphicsLineItem * e = dynamic_cast < QGraphicsLineItem * > (shape))
{
obj ["width"] = e->line().dx();
obj ["height"] = e->line().dy();
}
}
QJsonArray list;
for (QGraphicsItem * t : item->childItems ())
{
QJsonObject v = writeItem (t);
list.append (v);
}
obj ["items"] = list;
return obj;
}
Vytvoříme objekt a do něho vložíme seznam všech samostatných grafických prvků. \\
Na závěr třída **QJsonDocument** převede objekt na text vhodný pro uložení do souboru.
QByteArray writeJson (QGraphicsScene * scene)
{
QJsonObject obj;
QJsonArray list;
for (QGraphicsItem * item : scene->items (Qt::AscendingOrder))
{
if (item->parentItem() == nullptr)
list.append (writeItem (item));
}
obj ["items"] = list;
QJsonDocument doc (obj);
QByteArray code = doc.toJson ();
return code;
}
**demo.cc**
Ještě upravíme funkci **on_actionSave_triggered** volanou z menu našeho programu. \\
Dialogový box nabídne uživateli "filtry" //*.json// a //*.xml//. \\
Funkce **saveFile** otevře soubor a zapíše do něj data v JSONu nebo XML.
void MainWindow::saveFile (QString fileName, bool json)
{
QFile f (fileName);
if (f.open (QFile::WriteOnly))
{
if (json)
{
QByteArray code = writeJson (scene);
f.write (code);
}
else
{
QXmlStreamWriter w (&f);
writeXml (w, scene);
}
}
else
{
QMessageBox::warning (NULL, "Save File Error", "Cannot write file: " + fileName);
}
}
const QString dir = QString ();
const QString filter = "Json files (*.json);;XML files (*.xml)";
const QString jsonFilter = "Json files";
void MainWindow::on_actionSave_triggered ()
{
QString selectedFilter;
QString fileName = QFileDialog::getSaveFileName (this, "Save file", dir, filter, &selectedFilter);
if (fileName != "")
// saveFile (fileName, selectedFilter.startsWith (jsonFilter));
saveFile (fileName, fileName.endsWith (".json"));
}