У меня есть объект json, который я загружаю:
QJsonObject json = CommonToolkit::Types::LoadJson(config);
Вот часть содержимого файла json:
{
"config": {
"macos": {
"screen": {
"main": {
"height": 0,
"left": 0,
"top": 0,
"width": 0
}
},
"windows: {
}
Что я делаю, это проверяю, в какой ОС я работаю. Используя следующую переменную для хранения этой ОС:
QString osPath;
В моем тесте osPath = «macos»
Поэтому я хочу обновить геометрию приложений
QJsonObject jparam{
{ "height", value.height() },
{ "left", value.left() },
{ "width", value.width() },
{ "top", value.top() }
};
Моя проблема, когда я пытаюсь установить jon с jparam, используя osPath:
json["config"][osPath]["screen"]["main"] = jparam;
Я получаю ошибку:
/Users/adviner/Projects/Notes/src/Notes/data/config.cpp:87: ошибка: тип ‘QJsonValueRef’ не предоставляет оператор нижнего индекса
json [«config»] [osPath] [«screen»] [«main»] = jparam;
~~~~~~~~~~~~~~ ^ ~~~~~~
Редактирование Json в Qt не простая задача, в этом случае при использовании json["config"]
Вы получаете QJsonValueRef
этот класс является помощником для получения других типов элементов, таких как QJsonObject
, QJsonArray
, int
, QString
и т. д., чтобы получить следующий элемент должен быть использован toObject()
но это значение является копией, поэтому, если вы измените его, исходный элемент не будет изменен, вам придется переназначить его.
QJsonObject json = CommonToolkit::Types::LoadJson(config);
QString osPath = "macos";
QJsonObject jparam{
{ "height", value.height() },
{ "left", value.left() },
{ "width", value.width() },
{ "top", value.top() }
};
// get objects
QJsonObject config_obj = json["config"].toObject();
QJsonObject osPath_obj = config_obj[osPath].toObject();
QJsonObject screen_obj = osPath_obj["screen"].toObject();
// modify param
screen_obj["main"] = jparam;
// set objects
osPath_obj["screen"] = screen_obj;
config_obj[osPath] = osPath_obj;
json["config"] = config_obj;
Других решений пока нет …