当前位置: 首页 > article >正文

Qt 树形数据实战:从QAbstractItemModel到QTreeView的完整实现

1. Qt树形数据管理基础在Qt框架中处理树形数据是个常见需求比如文件浏览器、组织结构图或者配置项管理。我刚开始接触Qt时最头疼的就是理解Model/View架构特别是当需要自定义数据结构时。后来发现只要掌握几个关键点就能轻松实现复杂的树形展示。先说说为什么需要自定义模型。Qt自带的QStandardItemModel虽然简单易用但在处理大型数据或特殊需求时性能较差。去年我做的一个项目需要展示10万节点的设备拓扑图用标准模型直接卡死后来改用QAbstractItemModel才解决。树形结构的核心是父子关系。想象一下公司组织架构CEO是根节点下面是各部门总监再往下是普通员工。每个节点都需要知道自己的父节点和子节点列表这正是我们要实现的基础结构。2. 构建树形数据结构类2.1 TreeItem设计要点先来看数据结构的实现。我通常会创建一个独立的TreeItem类它不继承任何Qt类就是个纯数据结构。这个设计模式让我在多个项目中复用效果很不错。关键成员变量包括m_parent指向父节点的指针m_childrens子节点列表(QList)m_caption/m_description节点数据这里有个坑我踩过父节点管理。最初我忘记在addItem中设置父节点导致整个树形结构断裂。正确的做法是在构造函数和addItem中都维护父子关系TreeItem::TreeItem(TreeItem* parent, QString caption, QString description) : m_parent(parent), m_caption(caption), m_description(description) { if(parent) parent-addItem(this); // 自动添加到父节点 }2.2 内存管理注意事项Qt的父子对象机制虽然方便但和我们自定义的树形结构是两回事。我发现很多新手会混淆这两者。TreeItem的析构函数需要特别注意TreeItem::~TreeItem() { qDeleteAll(m_childrens); // 递归删除子节点 }如果不手动删除子节点会造成内存泄漏。我在一个长期运行的服务中就遇到过内存缓慢增长的问题最后发现是这里没处理好。3. 实现自定义模型类3.1 必须重写的五个函数继承QAbstractItemModel时这几个虚函数是必须实现的index()- 创建模型索引parent()- 返回父节点索引rowCount()- 返回子节点数columnCount()- 返回列数data()- 获取节点数据其中index()和parent()最容易出错。看我的实现QModelIndex CModel::index(int row, int column, const QModelIndex parent) const { if (!hasIndex(row, column, parent)) return QModelIndex(); TreeItem* parentItem parent.isValid() ? static_castTreeItem*(parent.internalPointer()) : m_topTreeItem; if (TreeItem* childItem parentItem-child(row)) return createIndex(row, column, childItem); return QModelIndex(); }这里有个技巧用internalPointer()存储TreeItem指针这是Qt提供的通用方案比用QPersistentModelIndex更高效。3.2 实现数据编辑功能要让树形数据可编辑还需要重写flags()- 返回ItemIsEditable标志setData()- 处理数据修改我建议在setData中发出dataChanged信号这样视图会自动更新bool CModel::setData(const QModelIndex index, const QVariant value, int role) { if (!index.isValid()) return false; TreeItem* item static_castTreeItem*(index.internalPointer()); bool changed false; switch(index.column()) { case 0: item-setCaption(value.toString()); changed true; break; case 1: item-setDescription(value.toString()); changed true; break; } if (changed) { emit dataChanged(index, index, {role}); return true; } return false; }4. 自定义树形视图实现4.1 扩展QTreeView功能继承QTreeView可以添加业务逻辑。比如在我的项目中需要实现右键菜单添加节点拖拽排序自定义绘制先看添加节点的实现void CTreeView::slotAddSubItem() { QModelIndexList selected selectionModel()-selectedRows(); if (selected.size() ! 1) return; TreeItem* parentItem static_castTreeItem*(selected.first().internalPointer()); TreeItem* newItem new TreeItem(parentItem, 新建节点); // 通知模型数据变化 QModelIndex parentIndex selected.first(); model()-insertRow(parentItem-childCount()-1, parentIndex); }4.2 视图刷新机制更新数据结构后视图刷新有几种方式resetModel()- 完全重置不推荐会丢失展开状态dataChanged()- 局部更新layoutChanged()- 结构变化时使用我推荐在添加节点时这样处理beginInsertRows(parentIndex, row, row); // 通知模型开始修改 // ...添加节点操作... endInsertRows(); // 通知模型修改结束这样能保持视图状态如展开的节点不被重置。5. 性能优化技巧处理大型树形数据时我总结了这些优化经验懒加载只加载可见节点数据滚动时动态加载模型缓存对计算量大的操作如rowCount添加缓存批量操作使用beginResetModel/endResetModel包裹大批量修改视图优化setUniformRowHeights(true); // 提高滚动性能 setAnimated(false); // 禁用动画一个实际案例在加载5000节点时通过懒加载将初始化时间从8秒降到0.5秒。关键代码QVariant CModel::data(const QModelIndex index, int role) const { if (!index.isValid()) return QVariant(); if (role Qt::DisplayRole) { if (!isLoaded(index)) { loadChildren(index); // 按需加载 return Loading...; } // ...返回实际数据 } return QVariant(); }6. 常见问题排查调试树形模型时这些问题最常遇到节点显示不全检查rowCount是否返回正确值父子关系错乱parent()实现是否正确编辑不生效确认flags()包含ItemIsEditable视图不更新是否漏发dataChanged信号有个有用的调试技巧重写QAbstractItemModel::mimeData()导出模型结构到文本我经常用这个方法来检查模型内部状态。树形数据的实现看似复杂但拆解后就会发现其实很直观。掌握这些核心要点后你就能轻松应对各种自定义树形结构的需求了。在实际项目中建议先用少量数据测试基本功能再逐步扩展到完整场景。

相关文章:

Qt 树形数据实战:从QAbstractItemModel到QTreeView的完整实现

1. Qt树形数据管理基础 在Qt框架中处理树形数据是个常见需求,比如文件浏览器、组织结构图或者配置项管理。我刚开始接触Qt时,最头疼的就是理解Model/View架构,特别是当需要自定义数据结构时。后来发现只要掌握几个关键点,就能轻松…...

奇安信天眼实战:从协议字段到告警分析的完整指南(附常见漏洞案例)

奇安信天眼实战:从协议字段到告警分析的完整指南(附常见漏洞案例) 在企业安全运维的日常工作中,高效识别和响应潜在威胁是每个安全工程师的核心任务。奇安信天眼系统作为国内领先的威胁检测与响应平台,其强大的协议分析…...

革新性微信协议交互引擎:构建企业级智能消息处理系统

革新性微信协议交互引擎:构建企业级智能消息处理系统 【免费下载链接】puppet-xp Wechaty Puppet WeChat Windows Protocol 项目地址: https://gitcode.com/gh_mirrors/pu/puppet-xp 在数字化办公与即时通讯深度融合的今天,企业级消息自动化处理面…...

GLM-Image WebUI惊艳案例分享:数字艺术、写实人像、概念设计作品集

GLM-Image WebUI惊艳案例分享:数字艺术、写实人像、概念设计作品集 1. 开启AI艺术创作新篇章 想象一下,你只需要用文字描述心中的画面,就能在几分钟内看到它变成精美的图像。这不是科幻电影的情节,而是GLM-Image WebUI带给我们的…...

华为eNSP模拟器实战:通过Telnet实现AC远程管理的AAA认证配置详解

1. 华为eNSP模拟器与AC远程管理基础 第一次接触华为eNSP模拟器时,我被它高度还原真实设备操作体验的特性惊艳到了。这个免费的模拟器不仅能完整模拟华为路由器、交换机等网络设备,还能搭建包含AC(接入控制器)和AP(接入…...

在 Windows 10 上安装 AMD APP SDK 3.0 (64 bits)

在 Windows 10 上安装 AMD APP SDK 3.0 {64 bits}1. AMD APP SDK Installer 3.0 for Windows 64 bits2. D:\Program Files\AMD APP SDK\3.0\References1. AMD APP SDK Installer 3.0 for Windows 64 bits AMD-APP-SDKInstaller-v3.0.130.135-GA-windows-F-x64.exe 解除锁定 C…...

Adobe力推的Gain Map到底是什么?一篇看懂它如何用一张图搞定HDR和SDR兼容

Gain Map技术解析:如何用一张图实现HDR与SDR的完美兼容 当你在社交媒体分享一张夕阳照片时,是否遇到过这样的困扰——手机上看到的绚丽色彩在朋友的老款显示器上变得平淡无奇?这种显示效果的不一致性,正是当前图像技术面临的核心挑…...

python基础学习笔记第五章

一、数据容器入门1. 定义一种可容纳多份数据的Python数据类型,每份数据为元素,元素可以是任意类型(字符串、数字、布尔等)。2. 分类(按特性划分)依据是否支持重复元素、是否可修改、是否有序分为5类&#x…...

HPatches数据集实战:从特征点检测到匹配精度的全链路评估

1. HPatches数据集入门指南 第一次接触HPatches数据集时,我和大多数开发者一样有点懵。这个在特征点检测领域赫赫有名的基准测试集,到底该怎么用才能发挥最大价值?经过几个项目的实战,我总结出了一套小白也能快速上手的方法。 HPa…...

MATLAB R2023b安装包下载及安装步骤说明

MATLAB安装教程 1.打开下载好的MATLAB2023b文件包,解压Windouw版本的MATLAB里面包含了三个文件,如图所示: 2.选择上述文件中的R2023b_-Windows.iso文件,右键点击选择装载,如下图所示: 装载好后的文件如下…...

Python爬虫进阶:自动化采集语音训练数据实战

Python爬虫进阶:自动化采集语音训练数据实战 1. 引言 语音合成技术的快速发展对高质量训练数据提出了巨大需求。以Qwen3-TTS为例,仅需3秒参考音频就能实现高精度音色克隆,但前提是需要大量优质的语音-文本配对数据。传统的手工采集方式效率…...

AutoDock Vina硼原子兼容性实战指南:解决1.1.2+版本特殊原子对接问题

AutoDock Vina硼原子兼容性实战指南:解决1.1.2版本特殊原子对接问题 【免费下载链接】AutoDock-Vina AutoDock Vina 项目地址: https://gitcode.com/gh_mirrors/au/AutoDock-Vina 诊断硼原子对接失败问题 作为一名计算药物学家,我最近在处理含硼…...

Gemma-3-12b-it图文问答典型错误分析:光照/遮挡/低分辨率应对策略

Gemma-3-12b-it图文问答典型错误分析:光照/遮挡/低分辨率应对策略 1. 工具概述 Gemma-3-12b-it是一款基于Google Gemma-3-12b-it大模型开发的多模态交互工具,专为本地图文问答场景优化。该工具通过全维度CUDA性能优化,支持图片上传与文本提…...

当AI学会“鉴谎”:企业舆情处置从被动救火到主动防御

最近跟几个做品牌公关的朋友聊天,发现大家都有一个共同的焦虑:网络上的信息传播太快了,一条负面视频、一篇恶意差评,可能一夜之间就让企业多年积累的声誉受到重创。更棘手的是,传统处置方式要么慢如蜗牛,要…...

快速体验SenseVoice语音识别:带量化ONNX模型一键启动服务

快速体验SenseVoice语音识别:带量化ONNX模型一键启动服务 1. 语音识别服务简介 SenseVoice是一款基于ONNX量化的多语言语音识别服务,特别适合需要快速部署和高效推理的开发场景。这个经过优化的模型能够在保持高精度的同时,显著降低资源消耗…...

Windows 基本操作快捷键

Windows 基本操作快捷键1. Windows 7 专业版2. Keyboard shortcuts in WindowsReferences1. Windows 7 专业版 2. Keyboard shortcuts in Windows Win 键是键盘上图标像窗户键。 快速切换窗口 Alt Tab 快速移到网页末 Ctrl End 快速移到网页首 Ctrl Home 锁屏 Win …...

100激光只是起步,易加增材把金属3D打印机做到3米级,全球最大!

易加增材:没有最大,只有更大。EP-M3050金属3D打印设备当前,金属3D打印正加快向大尺寸、一体化、高精度、高效率方向发展,航空航天、能源装备等领域对超大尺寸、多激光金属增材制造设备的需求持续上升。在此背景下,易加…...

亚马逊A+页面Shoppable系列实战:如何用交互设计提升30%转化率(附配置步骤)

亚马逊A页面Shoppable系列实战:如何用交互设计提升30%转化率(附配置步骤) 在亚马逊这个竞争激烈的电商平台上,产品页面的每一个像素都可能决定销售的成败。A页面作为品牌展示的重要阵地,已经从单纯的"电子说明书&…...

从“一通电就响”到“编程奏乐”:深入解析有源与无源蜂鸣器的核心差异与选型实战

1. 蜂鸣器基础:从"滴滴声"到"交响乐"的硬件选择 第一次接触蜂鸣器是在大学电子设计课上,当时我用单片机控制一个黑色小元件发出"滴滴"声,兴奋得像是发现了新大陆。后来才知道,那个黑色小元件就是最…...

Web 表白页面性能优化指南:Awesome-Love-Code 最佳实践

Web 表白页面性能优化指南:Awesome-Love-Code 最佳实践 【免费下载链接】Awesome-Love-Code 表白代码收藏馆~谁说程序猿不懂浪漫❤️ 项目地址: https://gitcode.com/gh_mirrors/aw/Awesome-Love-Code 在数字化时代,表白页面已成为程序员表达爱意…...

coze-loop代码优化器Mac M2本地部署:5分钟搭建你的AI编程助手

coze-loop代码优化器Mac M2本地部署:5分钟搭建你的AI编程助手 1. 为什么选择本地部署的AI代码优化器? 在软件开发过程中,我们经常遇到这样的困境:一段功能正常的代码,却存在性能瓶颈、可读性差或潜在风险。传统解决方…...

EVA-01效果展示:Qwen2.5-VL-7B对视频关键帧摘要+动作识别+事件检测

EVA-01效果展示:Qwen2.5-VL-7B对视频关键帧摘要动作识别事件检测 1. 引言:当视觉AI披上机甲战袍 想象一下,你有一段长达十分钟的监控视频,需要快速找出其中有人摔倒的片段;或者你手头有一堆产品演示视频,…...

Java框架开发短剧漫剧系统:后台管理与接口开发

本次开发采用Java主流框架组合,兼顾开发效率、可维护性与扩展性,核心技术选型:后端 SpringBoot 2.7.x(简化配置、快速开发) Spring Security(权限管控) MyBatis-Plus(数据操作&#…...

利用快马平台快速生成AppLite应用原型:十分钟搭建待办事项管理工具

最近在尝试快速验证一个待办事项管理工具的想法,不想在环境搭建和基础代码上耗费太多时间。正好了解到InsCode(快马)平台支持通过描述直接生成项目代码,于是决定用它结合AppLite这个轻量级框架来试试水。整个过程比预想的要顺畅,从输入想法到…...

RexUniNLU保姆级教学:从Jupyter访问到Schema调试全链路

RexUniNLU保姆级教学:从Jupyter访问到Schema调试全链路 你是不是遇到过这样的问题:拿到一段文本,想快速找出里面的人名、地名、公司名,但不想花时间标注数据训练模型?或者想给一堆评论自动分类,但又不确定…...

FaceForensics++数据集高效下载与配置全攻略

1. FaceForensics数据集简介与下载准备 FaceForensics(简称FF)是目前Deepfake检测领域最权威的基准数据集之一,包含1000多段原始视频和四种主流换脸技术生成的篡改视频。我第一次接触这个数据集时,光是下载就花了整整三天时间&…...

【高精度气象】从“被动响应”到“主动预警”:电网综合气象灾害风险分析平台如何深度融入电网运行?

当覆冰监测装置提前72小时发出预警,当调度系统根据风速预测自动调整新能源出力——电网终于学会了在灾害来临前“抢跑”。2026年1月19日,江苏宿迁。500千伏泗澜线舞动在线监测装置自动触发预警。运维人员赶到现场时,导线刚刚开始轻微舞动&…...

RT-Thread PWM开发避坑指南:从配置到调试的全流程解析

RT-Thread PWM开发避坑指南:从配置到调试的全流程解析 在嵌入式开发中,PWM(脉冲宽度调制)技术因其精准控制能力而广泛应用于电机驱动、LED调光、电源管理等场景。RT-Thread作为一款优秀的实时操作系统,为PWM开发提供了…...

2.5.第十六届蓝桥杯大赛软件赛省赛Java 大学 B 组(上)

1.逃离高塔问题描述:小蓝一觉醒来,小蓝被困在一座高耸的塔中。这座塔共有 20252025 层,每一层都刻有一个数字的立方值,从底层的 1313、2323、3333、⋯⋯,一直到顶层的 2025320253,层层叠叠,直入…...

RAG与GraphRAG:提升大模型准确性的关键技术,小白也能学会收藏!

本文介绍了RAG和GraphRAG技术,旨在增强大语言模型的准确性和可靠性。RAG通过检索外部知识库来支持生成回答,而GraphRAG则引入知识图谱进行深度信息挖掘。文章详细阐述了两种技术的架构、挑战和对比,并结合实际案例展示了在元数据检索场景中的…...