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);
}

总结

  • 知识理应共享,源码在此点我
相关推荐
Dovis(誓平步青云)22 分钟前
《QT学习第四篇:常见事件与UDP、TCP、文件系统、(锁、信号量、条件变量》
c语言·开发语言·汇编·qt
isyangli_blog9 小时前
OpenDayLight (Carbon 版本) 启动与组件安装
开发语言·php
vb2008119 小时前
FastAPI APIRouter
开发语言·python
Benszen9 小时前
KVM虚拟化解决方案
开发语言·perl
会编程的土豆9 小时前
Go 语言反射(Reflection)详解
开发语言·后端·golang
東雪木9 小时前
多线程与并发编程 专属复习笔记
java·开发语言·笔记·java面试
杨充9 小时前
1.3 浮点型数据设计灵魂
开发语言·python·算法
噜噜噜阿鲁~10 小时前
python学习笔记 | 11.3、面向对象高级编程-多重继承
java·开发语言
basketball61610 小时前
Go 语言从入门到进阶:4. 数组和MAP使用方法总结
开发语言·后端·golang
春生野草10 小时前
反射、Tomcat执行
java·开发语言