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();
});
}