首先,需要使用第三方库(例如rapidjson或者nlohmann/json)来读取json文件并解析其中的数据。
然后,在窗口左侧添加一个treeview控件,并根据json数据构建treeview的节点结构。
当用户双击treeview的子节点时,根据节点对应的数据,在窗口右侧打开对应的子界面。可以考虑使用QWidget作为子界面,根据需要显示不同的内容。
切换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();
}