在Datastructure Qt中存储目录层次结构

时间:2015-10-13 03:49:08

标签: c++ qt

我应该如何存储进入TreeView的数据?字典(QHash)?纯文本? JSON?

我的层次结构类似于:

{
    'Cloth': {
        'Tissue':None,
        'Leather': {
            'Bandage': None
        }
        },

    'Smoke': {
        'White':{
            'Smallscale': None,
            'Largescale':None
        }
    }
}

操作

当我单击一个leaf-Element时,它将检索Fullpath,如" Smoke / White / Smallscale" ,这将用作放置SQL查询的键

我会为每个条目使用 QStandardItem ,点击后,我会递归调用他们的父母,直到我点击root。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

您知道QJsonTreeWidget吗?

当然你不需要使用那个库,但我认为你应该在任何情况下使用JSON。它现在几乎是一个标准,在我们使用树木时非常有用。

Boost还有一个很棒的库,可以与JSON一起使用。

答案 1 :(得分:0)

您可以使用其中一个json库(如cajun)来解析json文件。

这是Qt部分:

#include <QtGui>
#include <QTreeView>

class SimpleTreeView :public QTreeView
{
    Q_OBJECT
public:
        SimpleTreeView(QWidget *parent = 0);

public slots:
    void slot_item_clicked(const QModelIndex &idx);

private:
         QStandardItemModel *model;
};

#include <simpletreeview.h>
#include <qmessagebox.h>
#include <qobject.h>

SimpleTreeView::SimpleTreeView(QWidget *parent) : QTreeView(parent)
{
        model = new QStandardItemModel(2,1);
        QStandardItem *item1 = new QStandardItem("Cloth");

        QStandardItem *item2 = new QStandardItem("Smoke");

        model->setItem(0, 0, item1);
        model->setItem(1, 0, item2);

        QStandardItem *item3 = new QStandardItem("White");
        item2->appendRow(item3);

        QStandardItem *leaf = new QStandardItem("Smallscale");
        leaf->setData("Smoke/White/Smallscale");
        item3->appendRow(leaf);
        setModel(model);

        connect(this, SIGNAL(clicked(const QModelIndex &)), this, SLOT(slot_item_clicked(const QModelIndex &)));
}

void SimpleTreeView::slot_item_clicked(const QModelIndex & idx)
{
    QString strData = model->itemFromIndex(idx)->data().toString();
    QMessageBox::information(NULL, "Title", strData, QMessageBox::Yes, QMessageBox::Yes);
}

// main.cpp
#include <QApplication>
#include <simpletreeview.h>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    SimpleTreeView view;
    view.show();
    return app.exec();
}