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

总结

  • 知识理应共享,源码在此点我
相关推荐
Eiceblue41 分钟前
Python 合并 Excel 单元格
开发语言·vscode·python·pycharm·excel
码农客栈2 小时前
qt QNetworkRequest详解
qt
SomeB1oody2 小时前
【Rust自学】15.2. Deref trait Pt.1:什么是Deref、解引用运算符*与实现Deref trait
开发语言·后端·rust
Say-hai2 小时前
QT6 + CMAKE编译OPENCV3.9
qt·opencv
情深不寿3172 小时前
C++----STL(list)
开发语言·c++
SomeB1oody3 小时前
【Rust自学】15.4. Drop trait:告别手动清理,释放即安全
开发语言·后端·rust
liruiqiang053 小时前
DDD-全面理解领域驱动设计中的各种“域”
开发语言·架构
前端熊猫3 小时前
JavaScript 的 Promise 对象和 Promise.all 方法的使用
开发语言·前端·javascript
weixin_421133414 小时前
编写python 后端 vscode 安装插件大全
开发语言·vscode·python
_GR4 小时前
Java程序基础⑪Java的异常体系和使用
java·开发语言