Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/21: Рейтинг темы: голосов - 21, средняя оценка - 4.86
 Аватар для Корыч
32 / 32 / 2
Регистрация: 26.10.2019
Сообщений: 244

Сохранение/загрузка в файл данных из TreeView или упрощение его работы

10.10.2022, 17:20. Показов 4634. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я перешёл с Delphi (Lazarus) на Qt. Поэтому некоторые штучки слегка неудобны, либо просто я не могу в них разобраться.
Короче, в лазарусе есть компонент TTreeView. Он работает просто: в него можно добавить элемент, к этому элементу можно добавить ещё элементы и т.д. Короче интуитивно понятно, как всё устроено (просто функции для добавления к элементу с определённым индексом, удаление, сортировка тоже всё видно по функциям). И ещё есть полезные функции SaveToFile и LoadFromFile (ну как функции... процедуры... ну допустим я их так называю), тут по названию понятно, что они сохраняют и загружают весь список в файл.
Ну и что я вижу в этом компоненте (извиняюсь, виджете) в Qt? Никаких подобных функций. Ищу инфу в интернете, нахожу какие-то абстрактные/иерархические модели таблиц/списков. Почитав немного про это, я не понял практически ничего.
Если не можете как-то сделать или найти унаследованный класс, который сможет упростить работу TreeView, хотя бы объясните мне, как это вообще работает. Заранее премного благодарен)
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.10.2022, 17:20
Ответы с готовыми решениями:

Сохранение рваного массива в файл и его загрузка в программу через файл
Не работает как надо. Что нужно исправить? private void btnLoadRaggedArray_Click(object sender, EventArgs e) { ...

Сохранение списка в файл и его загрузка
Задание такое: Список сохранить в типизированный файл, а при загрузке считать данные списка и внести их в таблицу. Вроде все логично, да и...

Сохранение списка(песен) в файл и его загрузка обратно
Друзья, доброго времени суток. У меня возникла проблема: У меня есть определенный List с типом StorageFile. В нем хранится список...

22
Покинул чат.
1133 / 728 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
21.10.2022, 17:32
Студворк — интернет-сервис помощи студентам
сделал переписал (с сайта по ссылке, которую выше выкладывал) методы сохранения.
Если бы не наличие колонок в узле дерева то норм, а так получилось трешово.
(создаю ноды дерева для столбцов, переношу из них данные в родительскую ноду ,а затем удаляю, -что некрасиво, говнокод и трешь)
Выкладываю этот говнокод пока, мб пригодится, а над нормальным решением надо подумать. В идеале хотелось бы код, не привязанный к структуре конкретного дерева(кстати по ссылке есть модель для QTreeView но не разбирался детально)

Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
#include "mainwindow.h"
#include <QTreeWidget>
#include <QVBoxLayout>
#include <QHeaderView>
#include <QLabel>
 
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QFile>
 
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    auto form=new QWidget;
    auto layout=new QVBoxLayout;
    form->setLayout(layout);
    setCentralWidget(form);
    auto tree=new QTreeWidget;
    layout->addWidget(new QLabel("Tree to File"));
    layout->addWidget(tree);
    tree->setHeaderHidden(true);
    tree->header()->setSectionResizeMode(QHeaderView::ResizeToContents);
 
    auto treeFromFile=new QTreeWidget;
    layout->addWidget(new QLabel("Tree from File"));
    layout->addWidget(treeFromFile);
    treeFromFile->setHeaderHidden(true);
    treeFromFile->header()->setSectionResizeMode(QHeaderView::ResizeToContents);
 
 
    struct {
        const int modelColumns=3,
                descriptionCount=5,
                countryIdx=0,
                brandIdx=1,
                modelIdx=2,
                yearIdx=3,
                mileageIdx=4;
    }treeConstants;
 
    tree->setColumnCount(treeConstants. modelColumns);
    treeFromFile->setColumnCount(treeConstants. modelColumns);
 
    auto setAuto=[tree, treeConstants](const QString &description)
    {
 
        if(description.isEmpty())
            return ;
 
        QStringList list=description.split(",");
 
        if(list.length()!=treeConstants.descriptionCount)
            return ;
 
        QString countryStr=list.at(treeConstants.countryIdx);
        QString brandStr  =list.at(treeConstants.brandIdx);
        QString modelStr  =list.at(treeConstants.modelIdx);
        QString yearStr   =list.at(treeConstants.yearIdx);
        QString mileageStr=list.at(treeConstants.mileageIdx);
 
        auto countryFind=tree->findItems(countryStr, Qt::MatchCaseSensitive,0);
 
        QTreeWidgetItem *country;
        if(countryFind.isEmpty()){
            country=new QTreeWidgetItem;
            country->setText(0, countryStr);
            country->setToolTip(0, "country");
            tree->addTopLevelItem(country);
        }
        else {
            country=countryFind.at(0);
        }
 
        auto brandFind=tree->findItems(brandStr,
                                       Qt::MatchCaseSensitive | Qt::MatchRecursive, 0);
        QTreeWidgetItem *brand;
        if(brandFind.isEmpty()){
            brand=new QTreeWidgetItem(country);
            brand  ->setText(0, brandStr);
            brand->setToolTip(0, brand->parent()->text(0));
        }
        else {
            brand=brandFind.at(0);
        }
 
        QTreeWidgetItem *model  =new QTreeWidgetItem(brand);
 
        model  ->setText(0, modelStr);
        model  ->setText(1, yearStr);
        model  ->setText(2, mileageStr);
 
        for(int i=0; i<treeConstants.modelColumns; i++){
 
            switch (i){
            case 0:
                model->setToolTip(i, model->parent()->text(0));
                break;
            case 1:
                model->setToolTip(i, "year");
                break;
            case 2:
                model->setToolTip(i, "mileage");
                break;
            }
        }
    };
 
 
 
    setAuto("Germany,Audi,A4,2022,20000");
    setAuto("Germany,Audi,A5,2022,20000");
    setAuto("Germany,Audi,q8,2022,20000");
 
    setAuto("Japan,Toyota,RAV4,2022,20000");
    setAuto("Japan,Toyota,Corolla,2022,20000");
    setAuto("Japan,Toyota,Camry,2022,20000");
 
    setAuto("Japan,Nissan,Terrano,2022,20000");
    setAuto("Japan,Nissan,Almera,2022,20000");
    setAuto("Japan,Nissan,Murano,2022,20000");
 
 
    /////////////////////////////////////////////////////////////
    //saving json
 
    int countryCount=tree->topLevelItemCount();
    if(!countryCount)
        return;
 
    QJsonObject jroot;
    QJsonArray jrootArray = jroot["root"].toArray();
    //country_________________________
    for(int i=0; i<countryCount; i++){
 
        QTreeWidgetItem *country=tree->topLevelItem(i);
        QString countryStr= country->text(0);
 
        QJsonObject jcountry;
        QJsonArray jcountryArray = jcountry[countryStr].toArray();
 
        //brand___________________________
        int brandCount=country->childCount();
        if(!brandCount)
            continue;
 
        for(int i=0; i<brandCount; i++){
 
            QTreeWidgetItem *brand=country->child(i);
            QString brandStr=brand->text(0);
 
            //model___________________________
            int modelCount=brand->childCount();
            if(!modelCount)
                continue;
 
            QJsonObject jbrand;
            QJsonArray jbrandArray = jbrand[brandStr].toArray();
 
            for(int i=0; i<modelCount; i++){
 
                QTreeWidgetItem *model=brand->child(i);
                QString modelStr  =model->text(0);
                QString yearStr   =model->text(1);
                QString mileageStr=model->text(2);
 
                QJsonObject jcontent;
                jcontent["year"]=yearStr;
                jcontent["mileage"]=mileageStr;
 
                QJsonObject jmodel;
                jmodel.insert(modelStr, jcontent);
 
                jbrandArray.append(jmodel);
            }
            jbrand[brandStr]=jbrandArray;
            jcountryArray.append(jbrand);
        }
        jcountry[countryStr]=jcountryArray;
        jrootArray.append(jcountry);
    }
    jroot["root"]=jrootArray;
 
    QFile jsonFile("e:/jsonTest.json");
    if (!jsonFile.open(QIODevice::WriteOnly))
        return;
 
    jsonFile.write(QJsonDocument(jroot).toJson(QJsonDocument::Indented));
    jsonFile.close();
 
    /////////////////////////////////////////////////////////////
    //load json
 
    QTreeWidgetItem* root=loadJson("e:/jsonTest.json", treeFromFile->invisibleRootItem());
    if(root)
        treeFromFile->addTopLevelItem(root);
 
}
 
 
QTreeWidgetItem* MainWindow::loadJson(const QString &filepath, QTreeWidgetItem *root)
{
    if(filepath.isEmpty())
        return nullptr;
    QFile file(filepath);
    if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
        return nullptr;
 
    const QByteArray raw_data=file.readAll();
    file.close();
 
    QJsonParseError json_error;
    QJsonDocument json_doc=QJsonDocument::fromJson(raw_data, &json_error);
    if(json_doc.isNull()||json_doc.isEmpty()||json_error.error!=QJsonParseError::NoError)
        return nullptr;
 
    if(json_doc.isObject())
        parseObject(json_doc.object(), root);
    else if(json_doc.isArray())
        parseArray(json_doc.array(), root);
 
    return root;
}
 
void MainWindow::parseObject(const QJsonObject &obj, QTreeWidgetItem* parent)
{
    const QStringList keys=obj.keys();
 
    for(const QString &item_key:keys){
 
        if(item_key=="root"){
            parseValue(obj.value(item_key), parent);
            continue;
        }
        QTreeWidgetItem* treeItem=new QTreeWidgetItem(parent);
        treeItem->setText(0,item_key);
        parseValue(obj.value(item_key), treeItem);
    }
}
 
void MainWindow::parseArray(const QJsonArray &arr, QTreeWidgetItem* parent)
{
    for(int i=0;i<arr.count();i++)
        parseValue(arr.at(i), parent);
}
 
QVariant MainWindow::parseValue(const QJsonValue &val, QTreeWidgetItem* parent)
{
    QVariant item_val{};
    switch (val.type()) {
    case QJsonValue::Object:
        parseObject(val.toObject(), parent);
        break;
    case QJsonValue::Array:
        parseArray(val.toArray(), parent);
        break;
    case QJsonValue::Bool:
        item_val=val.toBool();
        break;
    case QJsonValue::Double:
        item_val=val.toDouble();
        break;
    case QJsonValue::String:{
        item_val=val.toString();
        if(!parent->parent())
            break;
        QString parentStr=parent->text(0);
        if(parentStr=="year"){
            parent->parent()->setText(1, val.toString());//trach
            parent->parent()->removeChild(parent);//trash
        }
        if(parentStr=="mileage"){
            parent->parent()->setText(2, val.toString());//trash
            parent->parent()->removeChild(parent);//trash
        }
        break;
    }
    case QJsonValue::Null: break;
    case QJsonValue::Undefined: break;
    default: break;
    }
    return item_val;
}
 
 
MainWindow::~MainWindow()
{
}
1
Покинул чат.
1133 / 728 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
24.10.2022, 02:04
Сделал класс для load/save QTreeWidget`a в JSON файл. Проверял мало, так что всё может быть :/
Кликните здесь для просмотра всего текста



Работает только с данными узлов в виде строк,-то есть, если в узле будет какой-нибудь виджет,-инфу про него не сохраняет.
Плохо работает с пустым "" или " " именем узла.

Сохранение:
C++ (Qt)
1
2
JsonIO  json;
json.saveJson(filePath, treeWidget->invisibleRootItem());
Загрузка:
C++ (Qt)
1
2
treeWidget->clear();
json.loadJson(filePath, treeWidget->invisibleRootItem());
Сделал загрузку/сохранение от QTreeWidgetItem, чтобы иметь возможность добавлять несколько веток в один виджет, и сохранять не только все дерево, но и отдельные ветки.

MainWindow построен просто для тестов.

Qt 5+



Кликните здесь для просмотра всего текста
jsonio.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#ifndef JSONIO_H
#define JSONIO_H
 
#include <QObject>
 
class QTreeWidgetItem;
class QJsonObject;
 
class JsonIO : public QObject
{
    //Q_OBJECT
 
public:
    explicit JsonIO(QObject *parent = nullptr);
 
public:
    QJsonDocument loadJson(const QString &filePath, QTreeWidgetItem *root);
    void parseObject(const QJsonObject &obj, QTreeWidgetItem *parent);
    void parseArray(const QJsonArray &arr, QTreeWidgetItem *parent);
    QVariant parseValue(const QJsonValue &val, QTreeWidgetItem *parent);
 
    QJsonDocument saveJson(const QString &filePath, QTreeWidgetItem *root);
    void expandNode(QTreeWidgetItem *treeNode,  QJsonArray& parentJArray);
};
 
#endif // JSONIO_H
jsonio.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
#include "jsonio.h"
 
#include <QTreeWidget>
 
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
 
#include <QFile>
 
JsonIO::JsonIO(QObject *parent) : QObject(parent)
{
 
}
 
 
////////////////////////////////////////////
//loading
 
QJsonDocument JsonIO::loadJson(const QString &filePath, QTreeWidgetItem *root)
{
    if(filePath.isEmpty() || !root)
        return QJsonDocument();
 
    QFile file(filePath);
    if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
        return QJsonDocument();
 
    const QByteArray raw_data=file.readAll();
    file.close();
 
    QJsonParseError json_error;
    QJsonDocument json_doc=QJsonDocument::fromJson(raw_data, &json_error);
    if(json_doc.isNull()
            || json_doc.isEmpty()
            || json_error.error!=QJsonParseError::NoError)
        return QJsonDocument();
 
    if(json_doc.isObject())
        parseObject(json_doc.object(), root);
    else if(json_doc.isArray())
        parseArray(json_doc.array(), root);
 
    return json_doc;
}
 
void JsonIO::parseObject(const QJsonObject &obj, QTreeWidgetItem* parent)
{
    if(!parent || obj.isEmpty())
        return;
 
    const QStringList keys=obj.keys();
    QJsonArray columns;
    QJsonArray rows;
 
    for(const QString &key:keys){
 
        QJsonArray arr=obj.value(key).toArray();
 
        QString firstStr=arr.first().toString();
        QJsonObject firstObject=arr.first().toObject();
 
        if(!firstStr.isEmpty())
            columns=arr;
        if(!firstObject.isEmpty())
            rows=arr;
 
    }
 
    if(!columns.size()){
        for(int i=0; i<rows.size(); i++){
            parseValue( rows.at(i), parent);
        }
        return;
    }
 
    QTreeWidgetItem* treeItem=new QTreeWidgetItem(parent);
 
    for(int i=0; i<columns.size(); i++){
 
        treeItem->setText(i, columns.at(i).toString());
    }
 
    for(int i=0; i<rows.size(); i++){
        parseValue( rows.at(i), treeItem);
    }
}
 
 
void JsonIO::parseArray(const QJsonArray &arr, QTreeWidgetItem* parent)
{
    if(!parent || arr.isEmpty())
        return;
    for(int i=0;i<arr.count();i++){
        QVariant value=parseValue(arr.at(i), parent);
        if(!value.toString().isEmpty())
            parent->setText(i, value.toString());
    }
}
 
QVariant JsonIO::parseValue(const QJsonValue &val, QTreeWidgetItem* parent)
{
    if(!parent)
        return QVariant();
 
    QVariant item_val{};
 
    switch (val.type()) {
    case QJsonValue::Object:
        parseObject(val.toObject(), parent);
        break;
    case QJsonValue::Array:
        parseArray(val.toArray(), parent);
        break;
    case QJsonValue::Bool:
        item_val=val.toBool();
        break;
    case QJsonValue::Double:
        item_val=val.toDouble();
        break;
    case QJsonValue::String:{
        item_val=val.toString();
        break;
    }
    case QJsonValue::Null: break;
    case QJsonValue::Undefined: break;
    default: break;
    }
 
    return item_val;
}
 
 
////////////////////////////////////////////
//saving
 
QJsonDocument JsonIO::saveJson(const QString &filePath, QTreeWidgetItem *treeRoot)
{
    if(!treeRoot || filePath.isEmpty())
        return QJsonDocument();
 
    QJsonObject jroot;
 
    QJsonArray jrootArray = jroot[""].toArray();
 
    expandNode(treeRoot, jrootArray);
 
    jroot["JSON_root"]=jrootArray;
 
    QFile jsonFile(filePath);
    if (!jsonFile.open(QIODevice::WriteOnly))
        return QJsonDocument();
 
    QJsonDocument doc=QJsonDocument(jroot);
    jsonFile.write(doc.toJson(QJsonDocument::Indented));
    jsonFile.close();
    return doc;
}
 
void JsonIO::expandNode(QTreeWidgetItem *treeNode, QJsonArray &parentJArray)
{
    if(!treeNode)
        return;
 
    QString nodeName=treeNode->text(0);
 
    QJsonObject jnode;
    QJsonArray rowsArray;
    QJsonArray columnsArray;
 
    int columnCount=treeNode->columnCount();
    if(columnCount>0){
 
        for(int j=0; j<columnCount; j++)
            columnsArray.append( treeNode->text(j));
 
        QString columnFirst=columnsArray.first().toString();
        jnode["Array1. Node names: "+columnFirst]=columnsArray;
    }
 
    int childCount=treeNode->childCount();
    if(childCount){
        for(int i=0; i<childCount; i++){
 
            expandNode(treeNode->child(i), rowsArray);
        }
 
        jnode["Array2. Node childs: "+nodeName]=rowsArray;
    }
 
    parentJArray.append(jnode);
}

mainwindow.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
 
class JsonIO;
class QTreeWidget;
class QLabel;
class QPushButton;
class QTextEdit;
 
#include <QJsonDocument>
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
 
private:
    QTreeWidget* treeToFile;
    QTreeWidget* treeFromFile;
    QPushButton *saveBtn;
    QPushButton *loadBtn;
    QLabel *fileLabel;
    QPushButton  *setFileBtn;
    QTextEdit *textEdit;
    QLabel *textEditTitle;
 
private:
    inline void init();
    inline void styling();
    inline void connecting();
 
private:
    QString filePath/*="e:/jsonTest.json"*/;
    JsonIO *json;
    QJsonDocument document;
 
};
#endif // MAINWINDOW_H
mainwindow.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
#include "mainwindow.h"
 
#include <QVBoxLayout>
#include <QHBoxLayout>
 
#include <QTreeWidget>
#include <QHeaderView>
 
#include <QLabel>
#include <QPushButton>
#include <QTextEdit>
#include <QFileDialog>
 
#include "jsonio.h"
 
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    init();
    styling();
    connecting();
 
 
    QTreeWidgetItem *root=new QTreeWidgetItem;
    treeToFile->addTopLevelItem(root);
    root->setText(0,"root");
 
    QTreeWidgetItem *top1=new QTreeWidgetItem(root);
    top1->setText(0,"simple items");
 
    QTreeWidgetItem *sub1=new QTreeWidgetItem(top1);
    sub1->setText(0,"sub");
 
    QTreeWidgetItem *sub_sub1=new QTreeWidgetItem(sub1);
    sub_sub1->setText(0,"sub sub");
 
    QTreeWidgetItem *top2=new QTreeWidgetItem(root);
    top2->setText(0,"multi column items");
    top2->setText(1,"column 2");
    top2->setText(2,"column 3");
 
    QTreeWidgetItem *sub2=new QTreeWidgetItem(top2);
    sub2->setText(0,"sub");
    sub2->setText(1,"sub item");
    sub2->setText(2,"multi column");
 
    QTreeWidgetItem *sub_sub2=new QTreeWidgetItem(sub2);
    sub_sub2->setText(0,"sub sub");
    sub_sub2->setText(1,"sub sub item");
    sub_sub2->setText(2,"multi sub");
}
 
void MainWindow::init()
{
    json=new JsonIO(this);
 
    QWidget* form=new QWidget;
    QVBoxLayout* vLayoutMain=new QVBoxLayout;
 
    QVBoxLayout* vLayoutToFile=new QVBoxLayout;
    QVBoxLayout* vLayoutFromFile=new QVBoxLayout;
    QVBoxLayout* vLayoutText=new QVBoxLayout;
 
    QHBoxLayout* hLayout=new QHBoxLayout;
    QHBoxLayout* hLayoutFile=new QHBoxLayout;
 
    hLayout->addLayout(vLayoutToFile);
    hLayout->addLayout(vLayoutFromFile);
    hLayout->addLayout(vLayoutText);
 
    vLayoutMain->addLayout(hLayoutFile);
    vLayoutMain->addLayout(hLayout);
 
    form->setLayout(vLayoutMain);
    setCentralWidget(form);
 
    /*QTreeWidget**/ treeToFile=new QTreeWidget;
    treeToFile->setHeaderHidden(true);
    treeToFile->header()->setSectionResizeMode(QHeaderView::ResizeToContents);
    treeToFile->setColumnCount(3);
 
    /*QTreeWidget**/ treeFromFile=new QTreeWidget;
    treeFromFile->setHeaderHidden(true);
    treeFromFile->header()->setSectionResizeMode(QHeaderView::ResizeToContents);
    treeFromFile->setColumnCount(3);
 
    /*QPushButton* */ saveBtn=new QPushButton("Save to JSON file");
    /*QPushButton* */ loadBtn=new QPushButton("Load from JSON file");
 
    QHBoxLayout* hLayoutToFile=new QHBoxLayout;
    hLayoutToFile->addWidget(new QLabel("Tree to File"));
    hLayoutToFile->addWidget(saveBtn, 0, Qt::AlignRight);
    vLayoutToFile->addLayout(hLayoutToFile);
    vLayoutToFile->addWidget(treeToFile);
 
    QHBoxLayout* hLayoutFromFile=new QHBoxLayout;
    hLayoutFromFile->addWidget(new QLabel("Tree from File"));
    hLayoutFromFile->addWidget(loadBtn, 0, Qt::AlignRight);
    vLayoutFromFile->addLayout(hLayoutFromFile);
    vLayoutFromFile->addWidget(treeFromFile);
 
    /*QLabel* */ fileLabel=new QLabel("File:");
    /*QPushButton* */ setFileBtn=new QPushButton("Set JSON file");
    /*QTextEdit* */ textEdit=new QTextEdit;
 
    hLayoutFile->addWidget(setFileBtn,0,Qt::AlignLeft);
    hLayoutFile->addWidget(fileLabel);
    hLayoutFile->addStretch();
 
    textEditTitle=new QLabel("JSON text");
    textEditTitle->setFixedHeight(23);
    vLayoutText->addWidget(textEditTitle,0, Qt::AlignHCenter);
    vLayoutText->addWidget(textEdit);
}
 
 
void MainWindow::connecting()
{
    connect(setFileBtn, &QAbstractButton::clicked, this, [this]{
 
        filePath = QFileDialog::getOpenFileName(this,
                                                "Open JSON",
                                                "/home",
                                                "Image Files (*.json)");
        fileLabel->setText(filePath);
    });
 
    connect(saveBtn, &QAbstractButton::clicked, this,[this]{
 
        document=
        json->saveJson(filePath,
                      treeToFile->invisibleRootItem());
        QString jsonText = document.toJson(QJsonDocument::Indented);
        textEdit->setPlainText(jsonText);
        textEditTitle->setText("Saved JSON text");
    });
 
    connect(loadBtn, &QAbstractButton::clicked, this, [this]{
 
        treeFromFile->clear();
        document=
        json->loadJson(filePath,
                      treeFromFile->invisibleRootItem());
        QString jsonText = document.toJson(QJsonDocument::Indented);
        textEdit->setPlainText(jsonText);
        textEditTitle->setText("Loaded JSON text");
    });
}
 
 
void MainWindow::styling()
{
 
    setStyleSheet("QMainWindow{background: darkGray;}");
    QString qss="background: rgb(140,140,140);"
                "color: black;";
    treeToFile->setStyleSheet(qss);
    treeFromFile->setStyleSheet(qss);
    textEdit->setStyleSheet(qss);
}
 
 
MainWindow::~MainWindow()
{
}
0
 Аватар для Корыч
32 / 32 / 2
Регистрация: 26.10.2019
Сообщений: 244
01.11.2022, 23:37  [ТС]
Извиняюсь, забыл написать) Накидал парсер, всё получилось. Это намного проще, чем я думал (и чем вот эта вся возня). Код я кидать не буду, потому что он чисто под мой случай подстроен... Всем спасибо за помощь!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.11.2022, 23:37
Помогаю со студенческими работами здесь

Сохранение графика в файл остовного дерева и загрузка его
Возникла проблема с Сохранением нарисованного графика остовного дерева в файл . И так координаты вершин узлов у меня хранятся в массиве те...

Добавить к программе след действия: Сохранение и загрузка информации в текст. файл. Сохранение и загрузка информации в типизированный файл.
Помогите добавить к программе след действия: Сохранение и загрузка информации в текст. файл. Сохранение и загрузка информации в...

Сохранение и загрузка данных в файл
Добрый вечер всем. Столкнулся с какой-то элементарной проблемой, и не могу никак понять в чем траблы. Вот код: ... int main() ...

JavaFx, сохранение данных в файл и загрузка данных из файла
Написал программу на JavaFx, в котором есть данные риелторов заносятся в неупорядоченный список на основе массива(фамилия, номер телефона),...

Сохранение данных в текстовый файл и их загрузка
В общем не могу загрузить из текстового файла в stringgrid Код сохранения в файл for(int j=1; j&lt;=SConstr+2; j++) ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
23
Ответ Создать тему
Новые блоги и статьи
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
Модель здравосохранения 17. Планы на выгорание
anaschu 23.05.2026
Вот конкретная схема реализации: В классе Работник добавить: накопленнаяУсталость — растёт каждый час работы, снижается в перерывы и болезни коэффициентПрезентеизма — снижает продуктивность. . .
Изменение цветов в палитре gif файла aka фавикона
russiannick 23.05.2026
Изменение цветов в палитре gif файла, юзаемого как фавиконка в составе html-файла, помещенная в base64, средствами нативного Java Script, навеянное сном в майский день. Для работы необходим браузер,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru