模型索引:QModelIndex

一、为什么要使用模型索引
从名字可以看出,他是模型的索引,只要对模型实体(各种xxxModel的实体)施加这个索引,model就会返回数据集中对应的值,或者通过这个索引修改对应数据集中的值。

类比数组就更好理解了,char buf[8] = {'a', 'b','c','d','e'};  给定索引3,我们就能从数据集合中读出该值为'c',或者任意修改数据集中的第3个值的值。

当然这个例子不太恰当,因为在这个例子中buf这个变量,不仅是数据Data,而且是模型Model。在真正的MVC中,Data的实体是对用户隐藏的,用户只能通过Model来读写Data中的内容,也即只有模型才知道如何获取数据View是不知道,参见我的本系列前面的博文,这样的好处是用户不必关心Data在系统底层的组织方式。
 

二、为了使数据的显示存储分离,引入了模型索引(model index)的概念。通过模型索引,可以访问模型的特定元素的特定部分视图和委托使用模型索引来请求所需要的数据。由此可以看出,只有模型自己需要知道如何获得数据,模型所管理的数据类型可以使用通用的方式进行定义。模型索引保存有创建的它的那个模型的指针,使同时操作多个模型成为可能。

   模型索引提供了所需要的信息的临时索引,用于通过模型取回或者修改数据。由于模型随时可能重新组织其内部的结构,因此模型索引很可能变成不可用的,此时,就不应该保存这些数据。如果你需要长期有效的数据片段,必须创建持久索引。持久索引保证其引用的数据及时更新。临时索引(也就是通常使用的索引)由QModelIndex类提供,持久索引则是 QPersistentModelIndex 类。

  为了定位模型中的数据,需要三个属性:行号、列号以及父索引

QT中,Model接口由QAbstractItemModel类进行定义。不管底层数据是如何存储的,只要是QAbstractItemModel的子类,都提供一种表格形式的层次结构。视图利用统一的转换来访问模型中的数据。模型内部数据的组织方式并不一定和视图中数据的显示相同。一般来说,内置的这3种约定,已足以满足大多编程需求了。是这样约定的,见下图:

              

对于列表,指定行号就可以唯一确定一个格子;
对于表格,指定行号、列号就可以唯一确定一个格子;
对于形,指定行号、列号、父索引,才可以唯一确定一个格子;
QT为了使列表、表格、树,三者形式统一而做出的妥协,QT将这三者的item访问方式都规定为:必须提供3个参数:行号、列号、父索引。

只是对于列表模型、表格模型,接口函数已经有了默认参数而已,父索引填QModelIndex的默认构造时,代表最顶层的根节点项Root Item。

直接看官方例子可能会容易,以上图的表格模型为例,看看是如何访问ABC单元格的:

对于表格模型,上述代码的第3参均可不写,因为默认参数就是root节点,也即默认的构造QModelIndex()。

再以上图的树形模型为例,看看是如何访问ABC单元格的:


上述代码中,只要看懂了如何访问根节点的儿子A的儿子B,也即如何访问根节点的孙子B,那就算掌握了QModelIndex的精髓。

三、QModelIndex 是 Qt 中用于表示数据模型中项的索引的类。它包含了描述项位置的行号、列号和父索引等信息,用于在数据模型和视图之间进行数据交互。

QModelIndex 的主要成员函数和用途如下:

  • row():返回项的行号。
  • column():返回项的列号。
  • parent():返回项的父索引,用于构建层级结构的模型。
  • child():返回指定行列的子项的索引。
  • isValid():检查索引是否有效,即是否引用一个有效的项。
  • data():从模型中获取索引对应项的数据。
  • setData():将数据设置给索引对应项。
  • flags():返回索引对应项的标志,用于指示项的属性,例如是否可编辑、是否可选择等。

使用 QModelIndex,你可以通过行号和列号或者父索引来访问数据模型中的特定项。它在模型和视图之间提供了一种统一的方式来传递和操作项的位置信息。

大多数情况下,你无需直接创建 QModelIndex 对象,而是通过调用数据模型的成员函数(例如 index()parent()child())来获取索引对象。这些成员函数会根据模型的结构和布局返回正确的索引。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VMware安装CentOS7虚拟机

VMware 安装 获取 VMware 安装包 下载地址:链接:https://pan.baidu.com/s/1ELR5NZa7rO6YVplZ1IUigw?pwdplz3 提取码:plz3 包括:当然,也可以自己去别的地方下载,WMware 版本都差不多,现在用的比…

数据结构学习 jz14剪绳子

关键词:数学 动态规划 快速幂 这道题其实是分为两题。 题目一: 这道题我是没有思路的,看了k神的答案才知道有数学的方法。 方法一: 数学:其实中间的推导我没看,我服了。 思路: 复杂度计算&…

matplotlib:热图、箱形图、小提琴图、堆叠面积图、雷达图、子图

简介:在数字化的世界里,从Web、HTTP到App,数据无处不在。但如何将这些复杂的数据转化为直观、易懂的信息?本文将介绍六种数据可视化方法,帮助你更好地理解和呈现数据。 热图 (Heatmap):热图能有效展示用户…

WorkPlus企业内部即时通信新选择,打造高效协作新格局

在企业内部,快速、高效的沟通与协作是推动工作进程的关键。而即时通信工具成为了企业内部沟通的重要工具。作为一款优秀的企业内部即时通信工具,WorkPlus通过其出色的性能和独特的功能,为企业打造高效协作的新格局。 为什么选择WorkPlus作为企…

详解Matlab深度学习进行波形分割

🔗 运行环境:Matlab 🚩 撰写作者:左手の明天 🥇 精选专栏:《python》 🔥 推荐专栏:《算法研究》 🔐#### 防伪水印——左手の明天 ####🔐 💗 大家…

强化学习应用(三):基于Q-learning算法的无人车配送路径规划(提供Python代码)

一、Q-learning算法介绍 Q-learning是一种强化学习算法,用于解决基于环境的决策问题。它通过学习一个Q-table来指导智能体在不同状态下采取最优动作。下面是Q-learning算法的基本步骤: 1. 定义环境:确定问题的状态和动作空间,并…

逆变器之推挽谐振

首先把前级推挽电路分成几个模块:方波发生器、谐振LC、整流滤波以及负载。框图如下图所示: 分析前提:稳态 在推挽电路正常工作中,输入电压恒定、输出电流电压也恒定(电源处于稳定的工作状态中) 方波发生器…

Objective-C使用UISwitch控制UITextField显示明文或密文

1.xib中设计 2.关联控件 3.使用代码控制开关与TextField显示模式 4.开关控件UISwitch点击事件实现,点击时根据状态切换TextField显示模式 5.显示效果:

【Qt】QThread moveTothread-多线程的两种实现方法

一、如何理解多线程 二、实现多线程的两种方式(面向应用) 2.1 继承 QThread 的类 2.2 (推荐这种方式)函数 moveTothread() 三、多线程的释放问题(善后工作) 多线程的两种实现方法 一、如何理解多线程二、实现多线程的两种方式&…

文件操作(二)

͟͟͞͞🏀前言上一篇我们加们讲了什么是文件,为什么使用文件,以及流的概念。我们继续接上一篇来继续讲解我们的文件操作,这一篇将会详细的讲如何对文件进行读写。 目录 🚀一.文件的顺序读写 1.fgetc和fputc 2.fget…

oracle—IMU机制

正常的情况下,当事务需要回滚块的时候,是去undo表空间找 现在是在sharepool中分一个IMUbuffer,将所有的回滚信息写入。直接就可以从中取。减少了物理IO 同时这个过程也产生redo,直接就是图中红色的,不防止崩溃 优点 1…

Java21 + SpringBoot3集成WebSocket

文章目录 前言相关技术简介什么是WebSocketWebSocket的原理WebSocket与HTTP协议的关系WebSocket优点WebSocket应用场景 实现方式1. 添加maven依赖2. 添加WebSocket配置类,定义ServerEndpointExporter Bean3. 定义WebSocket Endpoint4. 前端创建WebSocket对象 总结 前…

Java 树形结构数据生成导出excel文件V2

** >> 相对于V1版本&#xff0c;优化了代码逻辑&#xff0c;合理使用递归计算树数据的坐标 << ** 1、效果 2、使用方法 import com.alibaba.fastjson.JSONArray; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Workboo…

Shiro框架:Shiro登录认证流程源码解析

目录 1.用户登录认证流程 1.1 生成认证Token 1.2 用户登录认证 1.2.1 SecurityManager login流程解析 1.2.1.1 authenticate方法进行登录认证 1.2.1.1.1 单Realm认证 1.2.1.2 认证通过后创建登录用户对象 1.2.1.2.1 复制SubjectContext 1.2.1.2.2 对subjectContext设…

【如何在 GitHub上面找项目】【转载】

很多的小伙伴&#xff0c;经常会有这样的困惑&#xff0c;我看了很多技术的学习文档、书籍、甚至视频&#xff0c;我想动手实践&#xff0c;于是我打开了GitHub&#xff0c;想找个开源项目&#xff0c;进行学习&#xff0c;获取项目实战经验。这个时候很多小伙伴就会面临这样的…

【数据结构 | 直接选择排序】

直接选择排序 基本思路直接插入排序SelectSort 基本思路 直接插入排序&#xff08;StraightInsertionSort&#xff09;的基本操作是将一个记录插入到已经排好序的有序表中&#xff0c;从而得到一个新的、记录数增1的有序表。 我们可以同时从数组的头部和尾部同时进行排序工作…

Pandoc:markdown转word

简介&#xff1a;Pandoc是由John MacFarlane开发的标记语言转换工具&#xff0c;可实现不同标记语言间的格式转换&#xff0c;堪称该领域中的“瑞士军刀”。Pandoc使用Haskell语言编写&#xff0c;以命令行形式实现与用户的交互&#xff0c;可支持多种操作系统&#xff1b;Pand…

IP-Adapter:用于文本到图像扩散模型的文本兼容图像提示适配器

文章目录 一、IP-Adapter简介二、IP-Adapter与img2img的区分&#xff08;一&#xff09;结构上的区别&#xff08;二&#xff09;流程上的区别&#xff08;三&#xff09;输出上的区别&#xff08;四&#xff09;原理上的区别 三、IP-Adapter的网络架构&#xff08;一&#xff…

自定义C#类库(.dll文件)

环境配置 操作系统&#xff1a;Windows 10 开发工具&#xff1a;Visual Studio 2022 .Net桌面开发环境&#xff1a; 开发步骤 &#xff08;一&#xff09;创建C#类库项目 &#xff08;二&#xff09;配置项目名称和项目路径 &#xff08;三&#xff09;选择所使用的框架&a…

ES数据聚合

1.数据聚合 聚合&#xff08;aggregations&#xff09;可以让我们极其方便的实现对数据的统计、分析、运算。例如&#xff1a; 什么品牌的手机最受欢迎&#xff1f; 这些手机的平均价格、最高价格、最低价格&#xff1f; 这些手机每月的销售情况如何&#xff1f; 实现这些…
最新文章