Čtení dat ve formátu JSON

Opět používáme QJsonObject,
předefinované [ ] používáme s indexem obsahujícím jméno položky,
výsledkem “indexace” je pomocný objekt s metodami toString a toInt,
pokud položka v objektu neexistuje je výsledkem prázdný řetězec, nula nebo hodnota zadaná jako parametr.

void readItems (QJsonObject obj, QGraphicsScene * scene,  QGraphicsItem * target);
void readItem (QJsonObject obj, QGraphicsScene * scene,  QGraphicsItem * target)
{
    QString type = obj ["type"].toString ();
    QGraphicsItem * item = createItem (type);
    if (item != nullptr)
    {
       item->setToolTip (obj ["name"].toString ());
 
       int x = obj ["x"].toInt ();
       int y = obj ["y"].toInt ();
       item->setPos (x, y);
 
       if (QAbstractGraphicsShapeItem * shape = dynamic_cast < QAbstractGraphicsShapeItem * > (item))
       {
          QColor c = getColor (obj ["pen"].toString (),  "red");
          QColor d = getColor (obj ["brush"].toString (), "yellow");
 
          shape->setPen (c);
          shape->setBrush (d);
 
          if (QGraphicsRectItem * r = dynamic_cast < QGraphicsRectItem * > (shape))
          {
              int w = obj ["width"].toInt (100);
              int h = obj ["height"].toInt (80);
              r->setRect (0, 0, w, h);
          }
 
          if (QGraphicsEllipseItem * e = dynamic_cast < QGraphicsEllipseItem * > (shape))
          {
              int w = obj ["width"].toInt (100);
              int h = obj ["height"].toInt (80);
              e->setRect (0, 0, w, h);
          }
       }
 
       if (QGraphicsLineItem * t = dynamic_cast < QGraphicsLineItem * > (item))
       {
           int w = obj ["width"].toInt (100);
           int h = obj ["height"].toInt (80);
           t->setLine (0, 0, w, h);
       }
 
       readItems (obj, scene, item); // read inner items, add to this item
       setupItem (item); // set movable flag
 
       if (target != nullptr)
          item->setParentItem (target);
       else
          scene->addItem (item);
    }
}

V případě položky items zkusíme zda ji právě čtený JSON objekt obsahuje a zda je to pole/seznam.
Metoda toArray vyzvedne seznam do proměnné typu QJsonArray a for cyklus zpracuje jednotlivé prvky.

void readItems (QJsonObject obj, QGraphicsScene * scene,  QGraphicsItem * target)
{
    if (obj.contains ("items") && obj ["items"].isArray())
    {
        QJsonArray list = obj ["items"].toArray ();
        for (QJsonValue item : list)
        {
            if (item.isObject ())
               readItem (item.toObject (), scene, target);
        }
    }
}

QJsonDocument převede vstupní řetězec znaků (obsah vstupního souboru) na QJsonObject.

void readJson (QByteArray code, QGraphicsScene * scene,  QGraphicsItem * target)
{
    QJsonDocument doc = QJsonDocument::fromJson (code);
    QJsonObject obj = doc.object ();
    readItems (obj, scene, target);
}

Pozměníme metodu on_actionOpen_triggered volanou z menu.

void MainWindow::loadFile (QString fileName, bool json)
{
    QFile f (fileName);
    if (f.open (QFile::ReadOnly))
    {
        if (json)
        {
            QByteArray code = f.readAll ();
            readJson (code, scene);
        }
        else
        {
           QXmlStreamReader r (&f);
           readXml (r, scene);
        }
        refreshTree ();
    }
    else
    {
       QMessageBox::warning (NULL, "Open File Error", "Cannot read file: " + fileName);
    }
}
 
void MainWindow::on_actionOpen_triggered ()
{
    QString selectedFilter;
    QString fileName = QFileDialog::getOpenFileName (this, "Open file", dir, filter, &selectedFilter);
    if (fileName != "")
        // loadFile (fileName, selectedFilter.startsWith (jsonFilter));
        loadFile (fileName, fileName.endsWith (".json"));
}
 
qt/graphics_read_json.txt · Last modified: 2020/09/30 12:00 by 88.103.111.44
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki