界面开发框架Qt新手入门教程 - 可编辑树模型的示例(一)

news2025/1/21 2:59:06

Qt 是目前最先进、最完整的跨平台C++开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。

The Qt Company是Digia Plc旗下的全资子公司。负责所有Qt活动,包括产品开发,商业和开源授权模式以及在开放管理模式下的Qt工程。其许可、支持和服务能力能够和开发者紧密合作以确保他们的Qt项目准时部署,不超预算并拥有竞争优势。

此示例演示如何实现一个简单的基于项的树模型,该模型可与模型/视图框架的其他类一起使用。

该模型支持可编辑项、自定义标题以及插入和删除行和列的功能。使用这些功能,还可以插入新的子项,这在支持的示例代码中显示。

概述

如模型子类化参考中所述,模型必须为标准模型函数集提供实现:flags()、data()、headerData()、columnCount() 和 rowCount()。此外,分层模型,比如这个,需要提供 index() 和 parent() 的实现。

可编辑模型需要提供 setData() 和 setHeaderData() 的实现,并且必须从其 flags() 函数返回合适的标志组合。

由于这个例子允许改变模型的维度,我们还必须实现insertRows(),insertColumns(),removeRows()和removeColumns()。

设计

与简单树模型示例一样,该模型只是充当类实例集合的包装器。每个都旨在保存树视图中一行项目的数据,因此它包含与每列中显示的数据对应的值列表。

由于 QTreeView 为模型提供了面向行的视图,因此很自然地为数据结构选择面向行的设计,该设计将通过模型向此类视图提供数据。尽管这使得树模型不太灵活,并且对于用于更复杂的视图可能不太有用,但它使设计变得不那么复杂,并且更易于实现。

内部项目之间的关系

在设计用于自定义模型的数据结构时,通过 TreeItem::p arent() 等函数公开每个项的父项很有用,因为它将使编写模型自己的 parent() 函数更容易。类似地,像 TreeItem::child() 这样的函数在实现模型的 index() 函数时很有帮助。因此,每个都维护有关其父级和子级的信息,使我们能够遍历树结构。该图显示了实例如何通过其 parent() 和 child() 函数进行连接。

在所示的示例中,可以通过调用其 child() 函数从根项获取两个顶级项 A 和 B,并且这些项中的每一个都从其 parent() 函数返回根节点,尽管这仅针对项 A 显示。

每个都在其私有成员(QVariant 对象列表)中表示的行中存储每一列的数据。由于视图中的每一列和列表中的每个条目之间存在一对一的映射,因此我们提供了一个简单的 data() 函数来读取列表中的条目,并提供了一个 setData() 函数来允许修改它们。与项目中的其他函数一样,这简化了模型的 data() 和 setData() 函数的实现。

我们将一个项目放在项目树的根目录中。此根项对应于空模型索引 QModelIndex(),该索引用于在处理模型索引时表示顶级项的父项。尽管根项在任何标准视图中都没有可见的表示形式,但我们使用其内部 QVariant 对象列表来存储字符串列表,这些字符串将传递给视图以用作水平标题。

通过模型访问数据

在图中所示的情况下,可以使用标准模型/视图 API 获取由 a 表示的信息片段:

QVariant a = model->index(0, 0, QModelIndex()).data();

由于每个项目都包含给定行中每一列的数据片段,因此可以有许多映射到同一对象的模型索引。例如,可以使用以下代码获取 b 表示的信息:TreeItem

QVariant b = model->index(1, 0, QModelIndex()).data();

同样的底层将被访问以获得与b.TreeItem相同行的其他模型索引的信息。

在模型类中,当我们在 index() 和 parent() 实现中使用 QAbstractItemModel::createIndex() 创建相应的模型索引时,我们通过为每个项目传递一个指针来将对象与模型索引相关联。我们可以通过在相关模型索引上调用 internalPointer() 函数来检索以这种方式存储的指针 - 我们创建自己的 getItem() 函数来为我们完成工作,并从我们的 data() 和 parent() 实现中调用它。

当我们控制项目的创建和销毁方式时,存储指向项目的指针很方便,因为我们可以假设从 internalPointer() 获得的地址是有效的指针。但是,某些模型需要处理从系统中的其他组件获取的项,并且在许多情况下,无法完全控制项的创建或销毁方式。在这种情况下,纯基于指针的方法需要辅以保护措施,以确保模型不会尝试访问已删除的项目。

在底层数据结构中存储信息

几段数据作为 QVariant 对象存储在每个实例的成员中。

该图显示了由前两个图中的标签 a、b 和 c 表示的信息片段如何存储在基础数据结构中的项目 A、B 和 C 中。请注意,模型中同一行的信息片段都是从同一项目获取的。列表中的每个元素对应于模型中给定行中每列公开的一条信息。

由于该实现是为与 QTreeView 一起使用而设计的,因此我们对其使用实例的方式添加了限制:每个项目必须公开相同数量的数据列。这使得查看模型保持一致,允许我们使用根项来确定任何给定行的列数,并且仅添加创建包含足够列数数据的项的要求。因此,插入和删除列是耗时的操作,因为我们需要遍历整个树来修改每个项目。

另一种方法是设计类,以便在修改数据项时截断或扩展单个实例中的数据列表。但是,这种“懒惰”的大小调整方法只允许我们在每行的末尾插入和删除列,而不允许在每行的任意位置插入或删除列。

使用模型索引关联项

与简单树模型示例一样,需要能够获取模型索引,找到相应的 ,并返回与其父项和子项对应的模型索引。

在图中,我们展示了模型的 parent() 实现如何使用上图中显示的项获取与调用方提供的项的父项对应的模型索引。

指向项 C 的指针是使用 QModelIndex::internalPointer() 函数从相应的模型索引中获取的。指针在创建时存储在索引内部。由于子项包含指向其父项的指针,因此我们使用其 parent() 函数来获取指向项 B 的指针。父模型索引是使用 QAbstractItemModel::createIndex() 函数创建的,将指向项 B 的指针作为内部指针传递。

Qt Widget组件推荐

  • QtitanRibbon - Ribbon UI组件:是一款遵循Microsoft Ribbon UI Paradigm for Qt技术的Ribbon UI组件,QtitanRibbon致力于为Windows、Linux和Mac OS X提供功能完整的Ribbon组件。
  • QtitanChart - Qt类图表组件:是一个C ++库,代表一组控件,这些控件使您可以快速地为应用程序提供漂亮而丰富的图表。
  • QtitanDataGrid - Qt网格组件:提供了一套完整的标准 QTableView 函数和传统组件无法实现的独特功能。使您能够将不同来源的各类数据加载到一个快速、灵活且功能强大的可编辑网格中,支持排序、分组、报告、创建带状列、拖放按钮和许多其他方便的功能。
  • QtitanDocking:允许您像 Visual Studio 一样为您的伟大应用程序配备可停靠面板和可停靠工具栏。黑色、白色、蓝色调色板完全支持 Visual Studio 2019 主题!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/527494.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

考研日语-详解ている、てある、ていく、てくる用法

目录 一、ている用法 1. 表示现在状态 2. 表示持续动作 3. 表示经验或习惯 4. 表示结果或效果 二、てある用法 1. 表示已经完成的动作 2. 表示现在状态 3. 表示被动 三、ていく用法 1. 表示未来的动作 2. 表示逐渐变化的过程 四、てくる用法 1. 表示过去到现在的…

Python实现哈里斯鹰优化算法(HHO)优化XGBoost分类模型(XGBClassifier算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 2019年Heidari等人提出哈里斯鹰优化算法(Harris Hawk Optimization, HHO),该算法有较强的全…

滴滴一面:BigKey问题很致命,如何排查和处理?

说在前面 在40岁老架构师 尼恩的读者社区(50)中,最近有小伙伴拿到了一线互联网企业如极兔、有赞、希音、百度、网易、滴滴的面试资格,遇到一几个很重要的面试题: 致命的的Redis BigKey 如何排查,你处理过吗? 与之类似…

Yield Guild Games: RON 质押来啦!

Yield Guild Games (YGG) 自 2022 年 7 月以来一直是 Ronin 区块链的验证者,在保障和维护网络方面发挥着至关重要的作用。随着 2023 年 4 月委托权益证明 (DPoS) 的推出,质押生态系统进一步民主化,允许更多的参与者在赚取奖励的同时为网络的安…

LabVIEWCompactRIO 开发指南19 原始以太网(TCP/UDP)

LabVIEWCompactRIO 开发指南19 原始以太网(TCP/UDP) TCP和UDP是所有以太网标准的低级构建块。原始TCP和UDP工具在几乎所有编程环境中都得到原生支持,包括LabVIEW。它们提供较低级别的通信功能,这些功能更灵活,但用户…

3.34 haas506 2.0开发教程-example -TFT显示自动生成的二维码

TFT显示自动生成的二维码 应用场景案例说明1.硬件2.连线图 代码源码链接[TFT显示二维码](https://www.yuque.com/haas506/wiki/pubazmzgrf30zws0) 应用场景 二维码在各个领域中的应用越来越广泛,其中一些主要应用场景包括: 电子商务:通过二维…

RHCSA之查看命令帮助手册

目录 RHCSA之查看命令帮助手册 查看命令类型 --- type Linux中对应的命令类型 帮助命令 help 命令 用法1 help 内部命令 用法2 命令 --help 命令的部分语法符号解析 man 命令 man命令用法 man的帮助级 man 命令帮助信息界面中的常用操作 man命令中帮助信息的结构以及意义…

CGAN(条件GAN)

相比于GAN,CGAN给生成器和辨别器都添加了一个辅助信息,假设为y,y可以是标签类别或者其他模态的信息。 目标函数相比于GAN在输入端的x和z变为在y条件下生成的x和z。 模型框架可以表示为: 代码: import argparse import os os.en…

如何在linux中配置JDK环境变量

在linux系统部署皕杰报表,因皕杰报表是一款纯java报表工具,运行时需要jre环境,所以要在服务器上配置三个jdk环境变量path、classpath、JAVA_HOME。 那么为什么要配置jdk环境变量呢?因为java软件运行时要用到一些java命令&#xff…

人体样本? 一站式医学微生态研究解决方案来啦!

细菌?真菌?古菌?病毒? 还在为人体微生态研究选择哪个切入点而苦苦纠结吗? 数据?算法?作图?分析? 还在苦于已有的分析内容脱离医学临床实际而不知所措吗? …

vue 3.0 静态路由配置

今天研究了一下vue3.0的静态路由配置,分享一下。 首先我们现在项目中建立router文件夹,如下图所示: 404文件夹存放404页面,components文件夹存放首页界面,config为设置文件夹,diz存放具体的业务逻辑和界面…

SpringMVC 执行流程

视图阶段(老旧JSP等) DispatcherServlet:接收请求、响应结果,所有的请求都要经过它,它是被Tomcat容器初始化的当这个类加载时会加载一些组件类HandlerMapping、HandlerAdapter、ViewResolver等等。 HandlerMapping:根…

考古:Transformer

论文1: 《Attention is all you need》 模型体系结构 Encoder 将符号表示的输入序列 ( x 1 , . . . , x n ) (x_1,...,x_n) (x1​,...,xn​)映射到连续表示的序列 z ( z 1 , . . . , z n ) z(z_1,...,z_n) z(z1​,...,zn​)。 给定 z z z,Encoder 然后一次产生一…

网络安全合规-个人信息安全影响评估

信息安全技术个人信息安全影响评估指南》 一、个人信息安全影响评估定义 个人信息安全影响评估Personal Information Security Impact Assessment,针对个人信息处理活动,检验其合法合规程度,判断其对个人信息主体合法权益造成损害的各种风险…

操作系统原理 —— 什么是进程互斥? 以及进程互斥的实现方式(十四)

什么是进程互斥? 在操作系统中,有两种资源共享方式,一种是互斥共享方式,一种是同时共享方式。 互斥共享方式就是指在系统中的某些资源,虽然可以提供给多个进程使用,但一个时间段内只允许一个进程访问该资…

看懂身份证识别OCR:从算法到 API 使用

引言 身份证识别OCR API是一种基于 OCR 技术的身份证识别服务,可以将身份证上的各种信息自动识别并提取出来,包括姓名、身份证号码、性别、民族、出生年月日、地址、签发机关和有效期等。 这项技术可以大大提高身份验证和信息采集的准确性和效率&#…

SpringBoot——配置文件的作用

简单介绍: 之前我们介绍了有关于SpringBoot文件结构的resources文件夹下面的两个子文件夹的作用,也就是在我们访问页面的时候使用方式静态资源的地方,那么在这个文件夹下面还有一个文件叫做application.properties,这个文件就是项…

【容器化应用程序设计和开发】2.6 DevOps实践和持续集成/持续部署流程

往期回顾: 第一章:【云原生概念和技术】 第二章:2.1 容器化基础知识和Docker容器 第二章:2.2 Dockerfile 的编写和最佳实践 第二章:2.3 容器编排和Kubernetes调度 第二章:2.4 容器网络和存储 第二章&…

IP信息收集

1.DNS服务器类型 例如bbs.neko.com,本地DNS服务器,根DNS服务器,TLD(TOP Level DNS)顶级域名服务器解析neko.com,authoritative DNS server(解析bbs.三级域名) 两种查询方式&#x…

2023年5月深圳数据分析师需要哪些证书?当然CPDA

CPDA数据分析师认证是大数据方面的认证,助力数据分析人员打下扎实的数据分析基础知识功底,为入门数据分析保驾护航。 帮助数据分析人员掌握系统化的数据分析思维和方法论,提升工作效率和决策能力,遇到问题能够举一反三&#xff0c…