使用QML的ListView自制树形结构图TreeView
背景
感觉QML自带的TreeView不是很好用,用在文件路径树形结构比较多,但是想用在自己数据里,就不太方便了,所以自己做一个。
用‘ListView里迭代ListView’的方法,制作树形结构,成果图:

代码
新建一个MyTreeView.qml用来写主要代码,再在main.qml中调用MyTreeView,并为它填充数据。
这里数据是在qml中用JSON.parse构建的json数据,也可以在cpp中用QJsonArray和QJsonObject来构建数据。
// MyTreeView.qml
import QtQuick 2.0Item {id: rootproperty alias model: list_view.modelListView {id: list_viewwidth: contentWidthanchors.fill: parentanchors.margins: 10delegate: list_delegate}Component {id: list_delegateItem{id: list_itemgroupwidth: leftLine.width + centre.width + rightLine.width + listView.widthheight: Math.max(centre.height, listView.height)property int lineY: leftLine.yRectangle {id: leftLinewidth: 20height: 1color: "#d3dee4"visible: modelData.id >= 0anchors.verticalCenter: centre.verticalCenter}Rectangle {id: centrewidth: 150height: 50color: "#d3dee4"radius: 5anchors.left: leftLine.rightanchors.verticalCenter: parent.verticalCenterText {text: qsTr(modelData.name)font.pixelSize: 20font.bold: trueanchors.centerIn: parent}}Rectangle {id: rightLinewidth: 20height: 1color: "#d3dee4"visible: modelData.subnodes.length > 0anchors.verticalCenter: centre.verticalCenteranchors.left: centre.right}Rectangle {id: verticalLinewidth: 1color: "#d3dee4"x: parent.width + 1visible: modelData.subnodes.length > 1anchors.top: parent.topanchors.bottom: parent.bottom}ListView {id: listViewdelegate: list_delegateheight: contentHeightwidth: contentWidthanchors.right: parent.rightmodel: modelData.subnodesspacing: 10onModelChanged: {}}Component.onCompleted: {listView.forceLayout() // 要先确保listView加载子项完成// 画一下verticalLine的y坐标起点和终点for (var i = 0; i < modelData.subnodes.length; i++) {var item = listView.itemAtIndex(i)if (i === 0) {verticalLine.anchors.topMargin = item.lineY} else if (i === modelData.subnodes.length-1) {verticalLine.anchors.bottomMargin = item.lineY}}}}}
}
// main.qml
import QtQuick 2.15
import QtQml.Models 2.15
import QtQuick.Window 2.12
import QtQuick.Controls 1.4Window {id: window_width: 940height: 680visible: truetitle: qsTr("Hello World")color: "#103e6f"Item {id: homeanchors.fill: parentMyTreeView {id: treeViewanchors.fill: parent}}Component.onCompleted: {var data = JSON.parse('[{"id": -1,"name": "目录","subnodes": [{"id": 0,"name": "第一本书","subnodes": [{"id": 1,"name": "第一章","subnodes": [{"id": 2,"name": "第一节","subnodes": []}, {"id": 3,"name": "第二节","subnodes": []}]}, {"id": 4,"name": "第二章","subnodes": [{"id": 5,"name": "第一节","subnodes": []}, {"id": 6,"name": "第二节","subnodes": []}, {"id": 7,"name": "第三节","subnodes": []}]}]}, {"id": 8,"name": "第二本书","subnodes": [{"id": 9,"name": "第一章","subnodes": [{"id": 10,"name": "第一节","subnodes": []}, {"id": 11,"name": "第二节","subnodes": []}]}, {"id": 12,"name": "第二章","subnodes": [{"id": 13,"name": "第一节","subnodes": []}]}]}]}]')treeView.model = data}}相关文章:
使用QML的ListView自制树形结构图TreeView
背景 感觉QML自带的TreeView不是很好用,用在文件路径树形结构比较多,但是想用在自己数据里,就不太方便了,所以自己做一个。 用‘ListView里迭代ListView’的方法,制作树形结构,成果图: 代码…...
2.MySQL面试题之索引
1. 为什么索引要用 B树来实现呢,而不是 B 树? MySQL 选择使用 B 树来实现索引,而不是 B 树,主要是基于以下几个原因: 1.1 数据存储和访问效率 B 树:在 B 树中,数据和索引都存储在每个节点中。…...
复制CodeIgniter新版的array_group_by辅助函数
很需要php数组的group_by功能,发现codeIgniter4.5新版中已有这个辅助函数,但我用的codeIgniter4.14没有,又不想升级php等一系列东西,就想把把codeIgniter4.5中array_group_by函数复制过来用。 先试着把新版本的array_helper文件及…...
合并两个 ES (Elasticsearch) 的数据
要将两个 Elasticsearch 实例中的同一个索引(/test_index)的数据合并到一个实例中,你可以按照以下步骤操作: 假设 Elasticsearch 1 (ES1) 和 Elasticsearch 2 (ES2) 都有相同的索引 /test_index。希望将 ES2 中的数据合并到 ES1 中。步骤 导出 ES2 的数据:使用 Elasticse…...
Linux网络协议.之 tcp,udp,socket网络编程(四).之网络转换函数htonl,ntohs等介绍
字节转换函数 把给定系统所采用的字节序称为主机字节序,为了避免不同类别主机之间在数据交换时由于对于字 节序的不同而导致的差错,引入了网络字节序。 主机字节序到网络字节序 u_long htonl(u_long hostlong); u_short htons(u_short short); 网络字节…...
LXC和udev知识点
1 POSIX pthread_create原理 1)fork()、pthread_create()、vfork()对应的系统调用分别是sys_fork()、sys_clone()、sys_vfork(),它们在内核中都是通过do_fork()实现的。 2)系统中所有的进程都组织在init_task.tasks链表下面,每个进…...
基于springboot+vue+uniapp的智慧校园管理系统小程序
开发语言:Java框架:springbootuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包&#…...
论文辅导 | 基于概率密度估计与时序Transformer网络的风功率日前区间预测
辅导文章 模型描述 本文所提出的时序优化Transformer 结构,该模型从结构上看由三部分组成:向量映射、编码器和解码器。编码器输入为数值天气预报数据以及相应的时间编码。解码器输入为预测日之前输出功率历史数据以及相应的时间编码。这些数据在经过向量…...
金蝶云星空单据体数量汇总-分组列信息
文章目录 金蝶云星空单据体数量汇总-分组列信息BOS配置效果展示 金蝶云星空单据体数量汇总-分组列信息 BOS配置 效果展示...
树状数组基础知识以及相关习题
文章目录 什么是树状数组?如何理解树状数组如何理解精髓lowbit二叉树和树状数组的结构树状数组的优点树状数组模板单点修改,区间查询区间修改,单点查询区间修改,区间查询树状数组法线段树法 树状数组基础练习题逆序对动态求连续区…...
2023大数据-架构师案例(八)
Lambda架构 nginx (b) Hbase (c)Spark Streaming (d)Spark (e)MapReduce (f)ETL (g)MemSQL (h)HDFS &#x…...
【Python】Python:探索未来科技的风向标
Python:探索未来科技的风向标 一、背景 近年来,随着人工智能、大数据、云计算等技术的飞速发展,Python 作为一门功能强大、简单易学的编程语言,逐渐成为了开发者的首选。在我国,Python 的热度持续攀升,不…...
Java语言程序设计——篇十一(6)
🌿🌿🌿跟随博主脚步,从这里开始→博主主页🌿🌿🌿 欢迎大家:这里是我的学习笔记、总结知识的地方,喜欢的话请三连,有问题可以私信🌳🌳&…...
2024年有哪些好用的文件加密软件?十款常用加密软件推荐
在2024年,随着数据泄露和网络威胁的日益复杂,文件加密软件成为了保护敏感信息不可或缺的工具。无论是个人用户还是企业,选择合适的加密软件都是确保数据安全的重要一环。 1. 安秉加密软件 安秉加密软件专为企业设计,提供全面的信…...
书生大模型学习笔记3 - 书生开源大模型链路体系
学习视频链接:书生浦语大模型全链路开源体系_哔哩哔哩_bilibili...
【竞技宝】奥运会:法国国奥淘汰埃及国奥晋级决赛
法国国奥在巴黎奥运会男足半决赛跟埃及国奥相遇,赛前大部分球迷和媒体,都一边倒看好法国国奥能轻松获胜。首先,法国国奥整体实力高出一个档次。最后,法国国奥坐拥主场作战的优势。所以,法国国奥正常发挥的话࿰…...
C++的STL简介(四)
目录 1.List 2.list 模拟实现 2.1基本框架 2.2 list_node 2.3 list 2.3.1 默认构造 2.3.2 析构函数 2.3.3 begin() 2.3.4 end() 2.3.5 size() 2.3.6 empty() 2.3.7 inser…...
NIO专题学习(一)
一、BIO/NIO/AIO介绍 1. 背景说明 在Java的软件设计开发中,通信架构是不可避免的。我们在进行不同系统或者不同进程之间的数据交互,或者在高并发的通信场景下都需要用到网络通信相关的技术。 对于一些经验丰富的程序员来说,Java早期的网络…...
Linux学习笔记:Linux基础知识汇总(个人复习版)
常用命令: 1、ls -a:显示所有文件(包括隐藏文件),简洁版 -l:显示所有文件,详细版 -R:显示所有文件以及子目录下文件,简洁版 可以搭配使用。 2、netstat -i&#x…...
MSR020/MSR040低温漂、低功耗电压基准
MSR020/MSR040 是低温漂、低功耗、高精度 CMOS 电压基准, 具有 0.05% 初始精度和低功耗的特点。 该器件的低输出电压迟滞和低长期输出电压漂移的 特性,可以进一步提高稳定性和系统可靠性。 此外,器 件的小尺寸和低工作电流的特性使其非…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
