/
Zero_Fly
/
JSON_viewer
Обзор
Документация
Войти
/
Zero_Fly
/
JSON_viewer
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
result
src/json-viewer/JSON_tree.cpp
205 строк
5 KB
akulyanin
close to finish JSON_tree
22 янв 2025, 15:04
22 янв 2025, 15:04
04f5434
Код
Авторство
О чём код?
#include "JSON_tree.h" TreeItem::TreeItem(const QVariant &data, TreeItem *parent) : itemData(data), parentItem(parent) { } TreeItem::~TreeItem() { qDeleteAll(childItems); } void TreeItem::appendChild(TreeItem *child) { childItems.append(child); } TreeItem *TreeItem::child(int row) { return childItems.value(row); } int TreeItem::childCount() const { return childItems.count(); } int TreeItem::columnCount() const { return 1; // We'll display only one column for simplicity } QVariant TreeItem::data(int column) const { if (column == 0) { if (itemData.type() == QVariant::Map) { QJsonObject obj = itemData.toJsonObject(); return obj.keys().first(); // Display the first key as the item name } else if (itemData.type() == QVariant::List) { return "Array"; } else { return itemData; } } return QVariant(); } void TreeItem::addData(QString data){ this->itemData = this->itemData.toString() + data; } int TreeItem::row() const { if (parentItem) return parentItem->childItems.indexOf(const_cast<TreeItem*>(this)); return 0; } TreeItem *TreeItem::getParentItem() { return parentItem; } JsonTreeModel::JsonTreeModel(const QString &jsonString, QObject *parent) : QAbstractItemModel(parent) { rootItem = new TreeItem(QVariant("Root")); QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonString.toUtf8()); if (!jsonDoc.isNull()) { if (jsonDoc.isObject()) { setupModelData(jsonDoc.object(), rootItem); } else if (jsonDoc.isArray()) { setupModelData(jsonDoc.array(), rootItem); } } } JsonTreeModel::~JsonTreeModel() { delete rootItem; } QVariant JsonTreeModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) return QVariant(); if (role != Qt::DisplayRole) return QVariant(); TreeItem *item = static_cast<TreeItem*>(index.internalPointer()); return item->data(index.column()); } Qt::ItemFlags JsonTreeModel::flags(const QModelIndex &index) const { if (!index.isValid()) return Qt::NoItemFlags; return Qt::ItemIsEnabled | Qt::ItemIsSelectable; } QVariant JsonTreeModel::headerData(int section, Qt::Orientation orientation, int role) const { if (orientation == Qt::Horizontal && role == Qt::DisplayRole) return rootItem->data(section); return QVariant(); } QModelIndex JsonTreeModel::index(int row, int column, const QModelIndex &parent) const { if (!hasIndex(row, column, parent)) return QModelIndex(); TreeItem *parentItem; if (!parent.isValid()) parentItem = rootItem; else parentItem = static_cast<TreeItem*>(parent.internalPointer()); TreeItem *childItem = parentItem->child(row); if (childItem) return createIndex(row, column, childItem); else return QModelIndex(); } QModelIndex JsonTreeModel::parent(const QModelIndex &index) const { if (!index.isValid()) return QModelIndex(); TreeItem *childItem = static_cast<TreeItem*>(index.internalPointer()); TreeItem *parentItem = childItem->getParentItem(); if (parentItem == rootItem) return QModelIndex(); return createIndex(parentItem->row(), 0, parentItem); } int JsonTreeModel::rowCount(const QModelIndex &parent) const { TreeItem *parentItem; if (parent.column() > 0) return 0; if (!parent.isValid()) parentItem = rootItem; else parentItem = static_cast<TreeItem*>(parent.internalPointer()); return parentItem->childCount(); } int JsonTreeModel::columnCount(const QModelIndex &parent) const { if (parent.isValid()) return static_cast<TreeItem*>(parent.internalPointer())->columnCount(); else return rootItem->columnCount(); } void JsonTreeModel::setupModelData(const QJsonObject &object, TreeItem *parent) { for (const QString &key : object.keys()) { QJsonValue value = object.value(key); TreeItem *item = new TreeItem(key, parent); if (value.isObject()) { setupModelData(value.toObject(), item); } else if (value.isArray()) { item->addData(" [" + QString(value.toArray().size())+"]"); setupModelData(value.toArray(), item); } else { item->addData(": " + value.toString()); } parent->appendChild(item); } } void JsonTreeModel::setupModelData(const QJsonArray &array, TreeItem *parent) { //int ind = for (const QJsonValue &value : array) { TreeItem *item = new TreeItem(parent->childCount(), parent); if (value.isObject()) { setupModelData(value.toObject(), item); } else if (value.isArray()) { setupModelData(value.toArray(), item); } else { item->addData(": " + value.toString()); } parent->appendChild(item); } }