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

总结

  • 知识理应共享,源码在此点我
相关推荐
陌小呆^O^6 分钟前
Cmakelist.txt之win-c-udp-server
c语言·开发语言·udp
Gu Gu Study13 分钟前
枚举与lambda表达式,枚举实现单例模式为什么是安全的,lambda表达式与函数式接口的小九九~
java·开发语言
Mr.Q16 分钟前
OpenCV和Qt坐标系不一致问题
qt·opencv
时光の尘28 分钟前
C语言菜鸟入门·关键字·float以及double的用法
运维·服务器·c语言·开发语言·stm32·单片机·c
以后不吃煲仔饭41 分钟前
Java基础夯实——2.7 线程上下文切换
java·开发语言
进阶的架构师42 分钟前
2024年Java面试题及答案整理(1000+面试题附答案解析)
java·开发语言
前端拾光者1 小时前
利用D3.js实现数据可视化的简单示例
开发语言·javascript·信息可视化
程序猿阿伟1 小时前
《C++ 实现区块链:区块时间戳的存储与验证机制解析》
开发语言·c++·区块链
傻啦嘿哟1 小时前
如何使用 Python 开发一个简单的文本数据转换为 Excel 工具
开发语言·python·excel
大数据编程之光1 小时前
Flink Standalone集群模式安装部署全攻略
java·大数据·开发语言·面试·flink