Qt 使用QTreeView显示并动态的增删改查JSON文件数据

news/2024/11/15 1:13:52/

文章目录

      • 效果图
      • 概述
      • 部分代码
      • 总结

效果图

请添加图片描述
在这里插入图片描述

概述

  • 本案例在此开源项目QJsonModel的基础上实现,动态的生成并操作JSON数据QJsonModel是一个基于QAbstractItemModelJSON数据模型,它提供了一种简单的方式来将JSON数据可视化,功能简单来说就是读取JSON文件显示与修改。

  • 根据具体的需求,修改了部分代码,添加了一些功能点。

    1. 添加了菜单,可增删数据
    2. 自定义约束数据类型
    3. 添加新旧值显示
    4. 自定义表头名称
    5. 鼠标悬浮提示
  • 总的来说就是使用的model-Viwe架构,通过QJsonModelJSON数据可视化,然后通过自定义的QTreeView来显示数据,,通过QStyledItemDelegate来添加自定义委托。

部分代码

  • 右键菜单
void CarTreeView::contextMenuEvent(QContextMenuEvent *event)
{/// 判断是否可编辑,不可编辑时,不响应右键菜单if (editTriggers() == QAbstractItemView::NoEditTriggers){event->ignore();return;}// 获取点击的项QModelIndex index = indexAt(event->pos());QJsonModel *model = qobject_cast<QJsonModel *>(this->model());if (index.isValid() && model){xxxx}
}
  • 删除指定行
  void QJsonModel::removeItem(const QModelIndex &index){if (!index.isValid())return;QJsonTreeItem *item = static_cast<QJsonTreeItem *>(index.internalPointer());QJsonTreeItem *parentItem = item->parent();beginRemoveRows(index.parent(), item->row(), item->row());parentItem->mChilds.removeAt(item->row());delete item;endRemoveRows();}
``- 为添加数组子项
```cpp
void QJsonModel::addArrayItem(const QModelIndex &index, QJsonObject jsonObject, const QString &key)
{if (!index.isValid())return;QJsonTreeItem *item = static_cast<QJsonTreeItem *>(index.internalPointer());// 确认当前item是数组类型if (!item && item->type() != QJsonValue::Array)return;// 创建新的QJsonTreeItem对象来表示QJsonObjectQJsonTreeItem *newBowlItem = new QJsonTreeItem(item);newBowlItem->setType(QJsonValue::Object);int count = item->childCount();newBowlItem->setKey(QString::number(count));// 添加新的QJsonTreeItem对象到item的子项列表中QJsonTreeItem *newItem = new QJsonTreeItem(newBowlItem);newItem->setType(QJsonValue::Object);newItem->setKey(key);newBowlItem->appendChild(newItem);// 将QJsonObject的每个键值对添加到新的QJsonTreeItem中for (auto it = jsonObject.begin(); it != jsonObject.end(); ++it){QJsonTreeItem *childItem = new QJsonTreeItem(newItem);childItem->setKey(it.key());childItem->setValue(it.value().toVariant());childItem->setType(it.value().type());newItem->appendChild(childItem);}// 将新的QJsonTreeItem添加到当前item的子项中item->appendChild(newBowlItem);// 通知模型数据已更改beginInsertRows(index, count, count);endInsertRows();
}
  • 保存
void TarPage::saveJsonFileData()
{setMessageOperation("生成炭块");QByteArray jsonData = ui->treeView->getJsonModel()->json();if (!nameDetection(jsonData))return;QFile file("xxx.json");if (!file.open(QIODevice::WriteOnly)){qDebug() << "无法打开文件进行写入";return;}file.write(jsonData);file.close();setMessageBox("炭块生成成功!", 1);
}

总结

  • 知识理应共享,源码在此点我。

http://www.ppmy.cn/news/1547084.html

相关文章

JSON-RPC-CXX深度解析:C++中的远程调用利器

一、引言 1. JSON-RPC 简介及其在 C 开发中的重要性 JSON-RPC&#xff08;JavaScript Object Notation - Remote Procedure Call&#xff09;是一种基于 JSON 格式的远程过程调用协议。在 C 开发中&#xff0c;它扮演着至关重要的角色。随着软件系统的日益复杂和分布式架构的…

PHP中小学优校管理系统小程序源码

&#x1f3eb; 中小学优校管理系统&#xff1a;打造教育新生态&#xff0c;赋能智慧校园 &#x1f3eb; &#x1f3f7;️ 开篇&#xff1a;为什么我们需要中小学优校管理系统&#xff1f; 在教育日新月异的今天&#xff0c;传统的管理模式已难以满足现代学校的需求。面对庞大…

Hadoop学习--第一章 Hello大数据分布式

第一章 Hello大数据分布式 数据导论 什么是数据? 数据&#xff1a;一种可以被鉴别的对客观事件进行记录的符号。 简单来说就是&#xff1a;对人类的行为及产生的事件的一种记录。 数据的价值 对数据的内容进行深入分析&#xff0c;可以更好的帮助了解事和物在现实世界的运…

(蓝桥杯C/C++)——基础算法(下)

目录 一、时空复杂度 1.时间复杂度 2.空间复杂度 3.分析技巧 4.代码示例 二、递归 1.递归的介绍 2.递归如何实现 3.递归和循环的比较 4.代码示例 三、差分 1.差分的原理和特点 2.差分的实现 3.例题讲解 四、枚举 1.枚举算法介绍 2.解空间的类型 3. 循环枚举解…

vue2和vue3的区别详解

vue2 VS vue3 对比vue2vue3配置脚手架cmd命令行可视化方式创建脚⼿架组件通信props、$emit、provide、$arrts、EventBus等props、$emit、provide、inject、arrts等数据监听watch,computedwatch,watchEffect,computed双向绑定Object.definePropertyProxyAPI⽣命周期四个阶段befo…

如何运营Github Org

目录 前言 正文 关于分支保护 特别说明 如何在Windows环境下配置GitHub Desktop GPG签名&#xff1f; 推荐分支保护选择 关于good first issue 如何设置good first issue&#xff1f; 关于Project 尾声 &#x1f52d; Hi,I’m Pleasure1234&#x1f331; I’m currently learni…

C++设计模式精选面试题及参考答案

目录 什么是单例模式?它的应用场景是什么?如何保证单例模式线程安全? 什么是工厂方法模式?如何与简单工厂模式进行比较? 抽象工厂模式和工厂方法模式有什么区别?请给出实际应用场景。 什么是建造者模式?它和工厂模式有什么不同? 在什么情况下使用单例模式?如何在…

相机光学(四十二)——sony的HDR技术

1.概述 索尼的HDR技术包括以下几种,这些技术共同构成了索尼在HDR领域的技术矩阵&#xff0c;旨在提供更宽广的动态范围、更丰富的色彩表现以及更真实的光影效果: Multi-frame HDR&#xff08;多帧异曝光HDR&#xff09;&#xff1a;这是一种通过不同曝光时间图像的多帧合成来实…