文章目录
- 效果图
- 概述
- 部分代码
- 总结
效果图
概述
-
本案例在此开源项目QJsonModel的基础上实现,动态的生成并操作JSON数据,
QJsonModel
是一个基于QAbstractItemModel
的JSON
数据模型,它提供了一种简单的方式来将JSON
数据可视化,功能简单来说就是读取JSON
文件显示与修改。 -
根据具体的需求,修改了部分代码,添加了一些功能点。
- 添加了菜单,可增删数据
- 自定义约束数据类型
- 添加新旧值显示
- 自定义表头名称
- 鼠标悬浮提示
- …
-
总的来说就是使用的model-Viwe架构,通过
QJsonModel
将JSON
数据可视化,然后通过自定义的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);
}
总结
- 知识理应共享,源码在此点我。