QT开发中文网

C++如何通过打开一个json文件去获取节点数据显示在窗口左侧treeview下,双击treeview的子节点去打开对应的子界面显示在窗口的右侧,切换json文件时将右侧窗口打开的界面关闭

  1. 首先,需要使用第三方库(例如rapidjson或者nlohmann/json)来读取json文件并解析其中的数据。

  2. 然后,在窗口左侧添加一个treeview控件,并根据json数据构建treeview的节点结构。

  3. 当用户双击treeview的子节点时,根据节点对应的数据,在窗口右侧打开对应的子界面。可以考虑使用QWidget作为子界面,根据需要显示不同的内容。

  4. 切换json文件时,需要将右侧窗口打开的界面关闭,以免出现界面重叠等问题。

下面是一个简单的示例代码,仅供参考:

#include <QMainWindow>
#include <QTreeView>
#include <QStandardItemModel>
#include <QVBoxLayout>
#include <QFile>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonValue>
#include <QJsonArray>

class JsonViewer : public QMainWindow {
    Q_OBJECT

public:
    explicit JsonViewer(QWidget *parent = nullptr)
        : QMainWindow(parent)
    {
        // 初始化界面
        m_treeView = new QTreeView(this);
        m_model = new QStandardItemModel(this);
        m_treeView->setModel(m_model);

        QWidget *centralWidget = new QWidget(this);
        QVBoxLayout *layout = new QVBoxLayout(centralWidget);
        layout->addWidget(m_treeView);

        setCentralWidget(centralWidget);

        // 读取json文件
        openJsonFile("data.json");
    }

private slots:
    void onTreeViewDoubleClicked(const QModelIndex &index)
    {
        // 双击treeview节点时打开对应的子界面
        QStandardItem *item = m_model->itemFromIndex(index);
        if (item->hasChildren())
            return;

        QString name = item->data(Qt::DisplayRole).toString();
        QString path = item->data(Qt::UserRole).toString();

        QWidget *widget = new QWidget(this);
        QVBoxLayout *layout = new QVBoxLayout(widget);
        QLabel *label = new QLabel(name, widget);
        layout->addWidget(label);

        setCentralWidget(widget);

        // 保存当前子界面信息
        m_lastPath = path;
        m_lastWidget = widget;
    }

private:
    void openJsonFile(const QString &filename)
    {
        QFile file(filename);
        if (!file.open(QIODevice::ReadOnly)) {
            qDebug() << "Failed to open file: " << filename;
            return;
        }

        QByteArray data = file.readAll();
        file.close();

        QJsonDocument doc = QJsonDocument::fromJson(data);
        if (!doc.isObject()) {
            qDebug() << "Invalid json format: " << filename;
            return;
        }

        QJsonObject root = doc.object();
        buildTreeView(root, m_model->invisibleRootItem());
    }

    void buildTreeView(const QJsonObject &node, QStandardItem *parent)
    {
        for (auto it = node.begin(); it != node.end(); ++it) {
            QString name = it.key();
            QJsonValue value = it.value();

            QStandardItem *item = new QStandardItem(name);
            parent->appendRow(item);

            if (value.isArray()) {
                QJsonArray array = value.toArray();
                for (int i = 0; i < array.size(); ++i) {
                    QJsonValue itemValue = array.at(i);
                    if (itemValue.isObject())
                        buildTreeView(itemValue.toObject(), item);
                }
            } else if (value.isObject()) {
                buildTreeView(value.toObject(), item);
            } else if (value.isString()) {
                QString path = value.toString();
                item->setData(path, Qt::UserRole);
            }
        }
    }

    void closeLastWidget()
    {
        if (m_lastWidget) {
            m_lastWidget->deleteLater();
            m_lastWidget = nullptr;
            m_lastPath.clear();
        }
    }

private:
    QTreeView *m_treeView;
    QStandardItemModel *m_model;

    QWidget *m_lastWidget = nullptr;
    QString m_lastPath;

};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    JsonViewer viewer;
    viewer.show();

    return app.exec();
}

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://qt.0voice.com/?id=557

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?