C++ i json

0

Witam, mam pytanie gdyż chcę w QT narysować kształty (co nie jest problemem) ale o kolorach pobranych z pliku .json (nie miałem z nim do czynienia). Mam plik json:

 {
    "colorsArray":[{
            "red":"#f00",
            "green":"#0f0",
            "blue":"#00f",
            "cyan":"#0ff",
            "magenta":"#f0f",
            "yellow":"#ff0",
            "black":"#000"
        }
    ]
}

I teraz moje pytanie, jak najelepiej (najprościej) było by zrobić, że funkcja losowała mi kolor z tego pliku i użyła go do rysowania? Lub może lepszą opcją jest pobranie tych kolorów i zapisanie do tablicy w c++ i wtedy losowanie?

0

Jeśli masz losować kolor z tych zadanych w jsonie to i tak musisz najpierw przeczytać te kolory i trzymać (choćby przez chwilę) w lokalnym cache. Zatem nie rozumiem w czym problem ;/

0

Ok, rozumie. Więc rzecz polega na tym, żeby odczytać fajnie te dane do QT? Mam Qt 4.8.4, więc da się to zrobić bo chyba json jest od 5.0?

0

Użyj biblioteki do jsona, np. https://github.com/gaudecker/qt-json albo jsoncpp.
Albo napisz własny parser jsona wzorując się na jsmn (http://zserge.com/jsmn.html).

0

Ok, zrobiłem według bibliteki z json tego z gita. Mniej więcej rozumiem, jak to działa, tylko jak chcę na przykładzie zobaczyć w moim QT to mi wywala błąd:

89bd28bf9e.png

Co jest przyczyną?

3

Qt 5 ma wsparcie dla JSon-a.
http://doc.qt.io/qt-5/qjsondocument.html#fromJson

void MainWindow::readJsonFormFile(const QString &fileName)
{
    QFile file(fileName);
    if (file.open(QFile::ReadOnly)) {
        QByteArray data = file.readAll();
        QJsonDocument doc = QJsonDocument::fromJson(data);
        if (doc.isObject()) {
            if (doc.object()["colorsArray"].isArray()) {
                QJsonArray array = doc.object()["colorsArray"].toArray();
                QJsonObject colorMap = array[0].toObject();
                processColorMap(colorMap);
            }
        }
    }
}

void MainWindow::processColorMap(const QJsonObject &map)
{
    for(QJsonObject::const_iterator i=map.begin(); i!=map.end(); ++i) {
        QString colorName = i.value().toString();
        QListWidgetItem *item = new QListWidgetItem(ui->listWidget);
        item->setData(Qt::DisplayRole, i.key());
        item->setData(Qt::ForegroundRole, QBrush(QColor(colorName)));
    }
}

Wynik:
9f12fad5dc.png

1

polecam boost::property_tree, jak nie możesz użyć QJsonDocument

0

Ok. Zrobiłem według Twoich funkcji i wyrzuca mi błąd:

error: expected unqualified-id before '{' token
 {
 ^

W czym tkwi problem?

Mam colors.json:

{
    "colorsArray":[{
            "red":"#f00",
            "green":"#0f0",
            "blue":"#00f",
            "cyan":"#0ff",
            "magenta":"#f0f",
            "yellow":"#ff0",
            "black":"#000"
        }
    ]
}

oraz wywołanie w main.cpp:

MainWindow w;
    w.show();
    w.readJsonFormFile(colors.json);

Z góry dzięki za pomoc

0

Dobra już problem rozwiązany. Stworzyłem listWidget tylko, że nie wyświetla mi się nic :/

1 użytkowników online, w tym zalogowanych: 0, gości: 1