qml实现Json可视化(头脑风暴、思维导图)

2024-06-20 07:38

本文主要是介绍qml实现Json可视化(头脑风暴、思维导图),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本demo来自 https://github.com/cjmdaixi/QuickJSONViewer

代码上传到了 https://download.csdn.net/download/u011942101/85005519

文章目录

  • Json杂谈
  • 实现的思路
  • 核心代码
  • 从中学习到了什么
  • 感谢无私奉献的人

Json杂谈

JSON是一个序列化的对象或数组,是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
很多Json数据解析工具。例如在线的 [https://www.sojson.com/simple_json.html],
在这里插入图片描述
此demo确实用图表的方式来展示Json结构,通过借鉴此代码,也可以快速的实现类似Xml等数据的图标展示。效果如图:
在这里插入图片描述

实现的思路

核心问题包括下面几个方面:

  1. 对JSON数据进行解析,我使用的是递归方法,比较容易理解。
  2. 同层级的节点放进一个ColumnLayout中,轻松实现均匀排布。
  3. 对JSON的数据类型需要判断,在JS中不好做,所以放在C++中实现,这里就涉及到如何在C++中构造QML对象以及设置属性。

核心代码

递归创建节点
para1 : 父节点 ,para2 : 节点的文本, para3 : josn数据 ,pare4 : 层级关系


QQuickItem * FluxHub::createObjectNode(QQuickItem *currentItem, const QString &key, const QJsonObject &jsonObj, int level)
{auto objectNode = createLevelItem(level, currentItem);setNodeText(objectNode, key);for(auto it = jsonObj.begin(); it != jsonObj.end(); ++it){auto child = it.value();auto childName = it.key();auto childType = it.value().type();QQuickItem *rt = nullptr;if(childType == QJsonValue::Object){rt = createObjectNode(objectNode, childName, child.toObject(), level + 1);}else if(childType == QJsonValue::Array){rt = createArrayNode(objectNode, childName, child.toArray(), level + 1);}else{rt = createLeafNode(objectNode, childName, child, level + 1);}if(rt == nullptr){qWarning()<<"Create child node error!"<<childName<<childType;return nullptr;}}return objectNode;
}
QQuickItem *FluxHub::createLevelItem(int level, QQuickItem *parentItem)
{auto *component = level >= m_levelComponents.count()?m_levelComponents.back() : m_levelComponents[level];auto item = qobject_cast<QQuickItem*>(component->create());if(item == nullptr){qWarning()<<"Create level item error!"<<component->errorString();return nullptr;}QQmlProperty layoutProp(parentItem, "childrenLayout");if(layoutProp.type() == QQmlProperty::Invalid){item->setParentItem(parentItem);}else{auto layout = layoutProp.read().value<QQuickItem*>();Q_ASSERT(layout);item->setParentItem(layout);}QQmlProperty colorProp(item, "color");colorProp.write(levelColor(level));return item;
}

//节点Node.qml

import QtQuick 2.7
import QtQuick.Layouts 1.3Item{id: rootimplicitWidth: childrenRect.widthimplicitHeight: childrenRect.heightproperty alias nodeRect: nodeContentRectproperty alias text: nodeText.textproperty alias childrenLayout: childrenLayoutproperty string colorRowLayout {id: rowLayoutspacing: 50Rectangle{id: nodeContentRectimplicitWidth: nodeText.contentWidth + 15implicitHeight: nodeText.contentHeight + 15color: root.colorradius: 5Text{id: nodeTextanchors.fill: parenthorizontalAlignment: Text.AlignHCenterverticalAlignment: Text.AlignVCenterfont{family: "Arial"pointSize: 15}color: "white"}}ColumnLayout{id: childrenLayoutspacing: 10onHeightChanged: lineCanvas.requestPaint();onWidthChanged: lineCanvas.requestPaint();}}Canvas{id: lineCanvasanchors.fill: parentonPaint: {var ctx = getContext("2d");ctx.reset();var pt1 = mapFromItem(nodeContentRect, nodeContentRect.width, nodeContentRect.height / 2);for(var i = 0; i !== childrenLayout.children.length; ++i){var item = childrenLayout.children[i];var pt2 = mapFromItem(item.nodeRect, 0, item.nodeRect.height / 2);ctx.moveTo(pt1.x, pt1.y);//ctx.lineTo(pt2.x, pt2.y);ctx.bezierCurveTo(pt1.x + 20, pt1.y, pt2.x - 20, pt2.y, pt2.x, pt2.y);}ctx.strokeStyle = "#969f95";ctx.lineWidth = 2;ctx.stroke();}}
}

从中学习到了什么

  1. c++ 中构造Qml对象,相关类 QQmlComponent
  2. c++中读取qml对象的属性,比如
QQmlProperty layoutProp(parentItem, "childrenLayout");
if(layoutProp.type() == QQmlProperty::Invalid){item->setParentItem(parentItem);
}else{auto layout = layoutProp.read().value<QQuickItem*>();Q_ASSERT(layout);item->setParentItem(layout);
}
QQmlProperty colorProp(item, "color");
colorProp.write(levelColor(level));
  1. qml Canvas 画线,位置的定位
 Canvas{id: lineCanvasanchors.fill: parentonPaint: {var ctx = getContext("2d");ctx.reset();var pt1 = mapFromItem(nodeContentRect, nodeContentRect.width, nodeContentRect.height / 2);for(var i = 0; i !== childrenLayout.children.length; ++i){var item = childrenLayout.children[i];var pt2 = mapFromItem(item.nodeRect, 0, item.nodeRect.height / 2);ctx.moveTo(pt1.x, pt1.y);//ctx.lineTo(pt2.x, pt2.y);ctx.bezierCurveTo(pt1.x + 20, pt1.y, pt2.x - 20, pt2.y, pt2.x, pt2.y);}ctx.strokeStyle = "#969f95";ctx.lineWidth = 2;ctx.stroke();}}

感谢无私奉献的人

这篇关于qml实现Json可视化(头脑风暴、思维导图)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1077514

相关文章

C++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

如何突破底层思维方式的牢笼

我始终认为,牛人和普通人的根本区别在于思维方式的不同,而非知识多少、阅历多少。 在这个世界上总有一帮神一样的人物存在。就像读到的那句话:“人类就像是一条历史长河中的鱼,只有某几条鱼跳出河面,看到世界的法则,但是却无法改变,当那几条鱼中有跳上岸,进化了,改变河道流向,那样才能改变法则。”  最近一段时间一直在不断寻在内心的东西,同时也在不断的去反省和否定自己的一些思维模式,尝试重

可视化实训复习篇章

前言: 今天,我们来学习seaborn库可视化,当然,这个建立在Matplotlib的基础上,话不多说,进入今天的正题吧!当然,这个是《python数据分析与应用》书中,大家有需求的可以参考这本书。 知识点: Matplotlib中有两套接口分别是pyplot和pyylab,即绘图时候主要导入的是Matplotlib库下的两个子模块(两个py文件)matplotlib.pyplot和matp

通过SSH隧道实现通过远程服务器上外网

搭建隧道 autossh -M 0 -f -D 1080 -C -N user1@remotehost##验证隧道是否生效,查看1080端口是否启动netstat -tuln | grep 1080## 测试ssh 隧道是否生效curl -x socks5h://127.0.0.1:1080 -I http://www.github.com 将autossh 设置为服务,隧道开机启动

Windows/macOS/Linux 安装 Redis 和 Redis Desktop Manager 可视化工具

本文所有安装都在macOS High Sierra 10.13.4进行,Windows安装相对容易些,Linux安装与macOS类似,文中会做区分讲解 1. Redis安装 1.下载Redis https://redis.io/download 把下载的源码更名为redis-4.0.9-source,我喜欢跟maven、Tomcat放在一起,就放到/Users/zhan/Documents

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测 目录 时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测基本介绍程序设计参考资料 基本介绍 MATLAB实现LSTM时间序列未来多步预测-递归预测。LSTM是一种含有LSTM区块(blocks)或其他的一种类神经网络,文献或其他资料中LSTM区块可能被描述成智能网络单元,因为

vue项目集成CanvasEditor实现Word在线编辑器

CanvasEditor实现Word在线编辑器 官网文档:https://hufe.club/canvas-editor-docs/guide/schema.html 源码地址:https://github.com/Hufe921/canvas-editor 前提声明: 由于CanvasEditor目前不支持vue、react 等框架开箱即用版,所以需要我们去Git下载源码,拿到其中两个主

android一键分享功能部分实现

为什么叫做部分实现呢,其实是我只实现一部分的分享。如新浪微博,那还有没去实现的是微信分享。还有一部分奇怪的问题:我QQ分享跟QQ空间的分享功能,我都没配置key那些都是原本集成就有的key也可以实现分享,谁清楚的麻烦详解下。 实现分享功能我们可以去www.mob.com这个网站集成。免费的,而且还有短信验证功能。等这分享研究完后就研究下短信验证功能。 开始实现步骤(新浪分享,以下是本人自己实现

基于Springboot + vue 的抗疫物质管理系统的设计与实现

目录 📚 前言 📑摘要 📑系统流程 📚 系统架构设计 📚 数据库设计 📚 系统功能的具体实现    💬 系统登录注册 系统登录 登录界面   用户添加  💬 抗疫列表展示模块     区域信息管理 添加物资详情 抗疫物资列表展示 抗疫物资申请 抗疫物资审核 ✒️ 源码实现 💖 源码获取 😁 联系方式 📚 前言 📑博客主页: