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

文章目录

效果图

概述

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

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

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

部分代码

  • 右键菜单
cpp 复制代码
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
    }
}
  • 删除指定行
cpp 复制代码
  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对象来表示QJsonObject
  QJsonTreeItem *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();
}
  • 保存
cpp 复制代码
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);
}

总结

  • 知识理应共享,源码在此点我
相关推荐
羊小猪~~5 分钟前
前端入门一之ES6--面向对象、够着函数和原型、继承、ES5新增方法、函数进阶、严格模式、高阶函数、闭包
开发语言·前端·javascript·css·vscode·html·es6
极客代码25 分钟前
【Python TensorFlow】进阶指南(续篇一)
开发语言·人工智能·python·深度学习·ai·tensorflow
南城花随雪。34 分钟前
Spring框架之模板方法模式 (Template Method Pattern)
java·开发语言·模板方法模式
十七算法实验室41 分钟前
Matlab实现鼠群优化算法(ROS)求解路径规划问题
开发语言·算法·决策树·支持向量机·matlab·动态规划·启发式算法
一名技术极客1 小时前
Three.js 搭建3D隧道监测
开发语言·javascript·3d
日晨难再1 小时前
C语言&Python&Bash:空白(空格、水平制表符、换行符)与转义字符
linux·c语言·开发语言·python·bash
阿巴~阿巴~1 小时前
C_数据结构(单链表算法题) —— 相交链表、环形链表I、环形链表II、随机链表的复制
c语言·开发语言·数据结构·算法·链表·1024程序员节
神奇夜光杯1 小时前
Python酷库之旅-第三方库Pandas(208)
开发语言·人工智能·python·excel·pandas·标准库及第三方库·学习与成长
yangpipi-1 小时前
数据结构(C语言版)-2.栈和队列
c语言·开发语言·数据结构
还在学习进步1 小时前
C语言第九周课——经典算法
c语言·开发语言·算法