Qt C++ | Вывод списка из json и получение поля json

Начал изучать Qt и C++. Вопрос:

Как получить объект из списка по клику, а точнее обратиться к полю json объекта?

Как правильно сделать список из массива объектов json?

Например, приходит {"array":[{"id": "1", "title": "item1"}, {"id": "2", "title": "item2"}]}, надо вывести список с title (например, QListWidget), а при нажатии на элемент (например, слот clicked) вывести в debug id элемента соответствующий json'у.


Ответы (1 шт):

Автор решения: Alexander Chernin
// Роль для идентификатора
const int idRole = Qt::UserRole + 100;

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //  Документ Json из исходных данных
    QJsonDocument doc = QJsonDocument::fromJson("{\"array\":[{\"id\": \"1\", \"title\": \"item1\"},  {\"id\": \"2\", \"title\": \"item2\"}]}");

    // Ищем данные по ключу
    QJsonValue value = doc["array"];

    // Если value это массив данных
    if ( value.type() == QJsonValue::Array ) {

        // Получаем массив
        QJsonArray array = value.toArray();

        for( int i = 0; i < array.size(); i++ ) {
            QJsonValueRef ref = array[i];

            // Если ValueRef это объект
            if ( ref.type() == QJsonValue::Object ) {
                QJsonObject obj = ref.toObject();
                QMap<QString, QVariant> map = obj.toVariantMap();

                // Создаем элемент списка
                QListWidgetItem* item = new QListWidgetItem();
                
                // Отображаем заголовок title
                item->setText(map.value("title").toString());
                // Сохраняем идентификатор id в данных элемента
                item->setData(idRole, map.value("id").toString());
                // Добавляем элемент в список
                ui->listWidget->addItem(item);
            }
        }
    }

    // Регистрируем обработчик сигнала клика по элементу списка
    connect(ui->listWidget, &QListWidget::itemClicked, [&](QListWidgetItem* item) {
        qDebug() << " id: " << item->data(idRole).toString() << " " << item->text();
    });

}
→ Ссылка