728x90

QTreeWidget에 Data를 추가 한 후 Json 형태로 Save 및 Load 하는 방법입니다.
 
먼저 좌측에 간단한 데이터가 입력된 Tree가 있고 Save로 Data를 Json 형태로 저장 후 Load 시 우측의 Tree에 Json Data를 출력하는 간단한 예제입니다.
 
아래는 코드 입니다. Save 버튼을 클릭했을 때  Tree의 정보를 Json형태로 Save 하고 Load 버튼을 클릭했을 때 Json을 읽어서 Tree에 Item을 생성하여 넣어줍니다.

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

    connect ( ui->btnSave, &QPushButton::clicked, this, [&] {
        QJsonObject saveData;           // 전체 Json 저장할 Object 객체

        QFile saveFile("SaveFile.json");
        if ( !saveFile.open(QIODevice::WriteOnly) ) {
            return;
        }

        QJsonArray TopArray;        // Top Item을 저장할 Array 객체
        for ( int i = 0; i < ui->saveTree->topLevelItemCount(); i++ ) {
            QJsonObject TopObject;

            auto TopItem = ui->saveTree->topLevelItem(i);
            TopObject.insert("Name", TopItem->text(0));

            QJsonArray ChildArray;      // Child Item을 저장할 Array 객체
            for ( int c = 0; c < TopItem->childCount(); c++ ) {
                QJsonObject ChildObject;

                auto ChildItem = TopItem->child(c);
                ChildObject.insert("Name", ChildItem->text(0));
                ChildObject.insert("Value", ChildItem->text(1));
                ChildArray.append(ChildObject);
            }

            TopObject.insert("Child", ChildArray);
            TopArray.append(TopObject);
        }

        saveData.insert("Top", TopArray);

        saveFile.write(QJsonDocument(saveData).toJson());
        saveFile.close();
    });

    connect ( ui->btnLoad, &QPushButton::clicked, this, [&] {
        QFile loadFile("SaveFile.json");
        if ( !loadFile.open(QIODevice::ReadOnly) ) {
            return;
        }

        QJsonDocument loadDocument = QJsonDocument::fromJson(loadFile.readAll());

        auto TopData = loadDocument.object().value("Top").toArray();        // Top Array 정보를 불러옴
        for ( auto topIt = TopData.cbegin(); topIt != TopData.cend(); ++topIt ) {
            auto top = (*topIt).toObject();
            auto makeItem = [&](QJsonObject& topJson) -> QTreeWidgetItem* {
                QTreeWidgetItem* topItem = new QTreeWidgetItem;

                topItem->setText(0, topJson.value("Name").toString());

                auto Child = topJson.value("Child").toArray();      // Top 하위의 Child Array 정보를 불러옴
                for ( auto childIt = Child.cbegin(); childIt != Child.cend(); ++childIt ) {
                    auto childObject = (*childIt).toObject();

                    QTreeWidgetItem* childItem = new QTreeWidgetItem(topItem);
                    childItem->setText(0, childObject.value("Name").toString());
                    childItem->setText(1, childObject.value("Value").toString());
                }

                return topItem;
            }; // Top 정보를 가지고 Item 생성해주는 람다 함수

            ui->loadTree->addTopLevelItem(makeItem(top));
        }

        loadFile.close();
    });
}
{
    "Top": [
        {
            "Child": [
                {
                    "Name": "Ten",
                    "Value": "10"
                },
                {
                    "Name": "Eleven",
                    "Value": "11"
                }
            ],
            "Name": "One"
        },
        {
            "Child": [
            ],
            "Name": "Two"
        }
    ]
}

 

728x90

+ Recent posts