Qt 模型视图(二):模型类QAbstractItemModel

server/2024/11/13 8:14:44/

文章目录

  • Qt 模型视图(二):模型类`QAbstractItemModel`
    • 1.基本概念
      • 1.1.模型的基本结构
      • 1.2.模型索引
      • 1.3.行号和列号
      • 1.4.父项
      • 1.5.项的角色
      • 1.6.总结

Qt 模型视图(二):模型类QAbstractItemModel

模型/视图结构是一种将数据存储界面展示分离的编程方法。模型存储数据,视图组件显示模型中的数据,在视图组件里修改的数据会被自动保存到模型里。模型的数据来源可以是内存中的字符串列表或二维表格型数据,也可以是数据库中的数据表,一种模型可以用不同的视图组件来显示数据,所以模型/视图结构是一种高效、灵活的编程结构。

1.基本概念

在模型/视图架构中,模型提供了一个标准接口,视图和委托使用该接口访问数据。在Qt中,标准接口由QAbstractItemModel类定义。无论数据项如何存储在任何底层数据结构中,QAbstractItemModel的所有子类都将数据表示为包含表项的层次结构。视图使用此约定访问模型中的数据项,但它们向用户呈现此信息的方式不受限制。模型还通过信号和插槽机制将任何有关数据更改的信息通知附加的视图。

1.1.模型的基本结构

有3种常见的展示形式,分别是列表模型( list model ),表格模型( table model )和树状模型( tree model )。不管模型的表现形式如何,模型中存储数据的基本单元都是项 (item),每个项有一个行号和一个列号,还有一个父项(parent item)。3个模型都有一个隐藏的根项(root item),列表模型的存储结构就是一列,表格模型的存储结构是规则的二维数组,树状模型的项可以有子项,结构更为复杂一些。
在这里插入图片描述

图 1 模型的3中展示形式

1.2.模型索引

为了确保数据的展示与数据的存储方式分离,模型中引入了模型索引(model index)的概念。通过模型能访问的每个项都有一个模型索引,视图组件和代理都通过模型索引来请求数据。这样只有模型需要知道怎样获取数据,被模型管理的数据可以广泛地被定义。模型索引提供访问数据的临时指针,用于通过模型提取或修改数据。

1.3.行号和列号

模型的基本形式是用行和列定义的表格数据,但这并不意味着底层的数据是用二维数组存储的,使用行和列只是为了组件之间交互方便。一个模型索引包含行号和列号。要获得一个模型索引,必须提供 3 个参数:行号、列号、父项的模型索引。例如,对于图 1中的表格模型中的 3 个项 A、B、C,获取其模型索引的示意代码如下:
QModelIndex indexA = model->index(0, 0, QModelIndex());
QModelIndex indexB = model->index(1, 1, QModelIndex());
QModelIndex indexC = model->index(2, 1, QModelIndex());

1.4.父项

对于列表模型和表格模型,每个项的父项都是顶层项,用QModelIndex()表示,而树状模型情况比较复杂,项一般称为节点。例如,对于图 1中的树状模型中的 3 个项 A、B、C,获取其模型索引的示意代码如下:

QModelIndex indexA = model->index(0, 0, QModelIndex());
QModelIndex indexB = model->index(1, 1, indexA );
QModelIndex indexC = model->index(2, 1, QModelIndex());

其中节点A和节点C的父节点是顶层节点,节点B的父节点是节点A。

1.5.项的角色

模型中的项能够有不同的角色,可以在不同的情况提供不同的数据。角色由枚举类Qt::ItemDataRole定义。

**表 1 枚举类Qt::ItemDataRole**常用的一些枚举值及其含义
枚举值角色数据类型含义
Qt::DisplayRole0QString界面上显示的字符串
Qt::DecorationRole1QIcon,QColor,QPixmap界面上装饰数据,如图标
Qt::EditRole2QString界面上编辑器中的数据
Qt::ToolTipRole3QString项的toolTip字符串
Qt::StatusTipRole4QString项的statusTip字符串
Qt::WhatsThisRole5QString'这是什么’模式下显示的数据
Qt::FontRole6QFont项的字体
Qt::TextAlignmentRole7Qt::Alignment项的对齐方式
Qt::BackgroundRole8QBrush项的背景色
Qt::ForegroundRole9QBrush项的前景色,如文字颜色
Qt::CheckStateRole10Qt::CheckState项的复选状态
Qt::AccessibleTextRole11QString扩展的可访问文本
Qt::AccessibleDescriptionRole12QString出于无障碍目的对项的描述
Qt::SizeHintRole13QSize提供给视图的项的大小提示
Qt::InitialSortOrderRole14Qt::SortOrder标题视图的初始排序顺序
Qt::UserRole0x0100QVanriant自定义的用户数据

1.6.总结

  • 模型索引以独立于任何底层数据结构的方式提供有关模型提供的项的位置的视图和委托信息。
  • 项目由其行号和列号以及其父项目的模型索引引用。
  • 模型索引由模型根据其他组件(如视图和委托)的要求构建。
  • 如果在使用index()请求索引时为父项指定了有效的模型索引,则返回的索引将引用模型中该父项下的项。所获得的索引是指该项的子项。
  • 如果在使用index()请求索引时为父项指定了无效的模型索引,则返回的索引将引用模型中的顶级项。
  • 角色区分与项目关联的不同类型的数据。

http://www.ppmy.cn/server/119195.html

相关文章

Laya2.x出包alipay小游戏

小游戏开发者工具,支付宝官方已经出了,不说了。 1.LAYA2.X打出得小游戏包中my-adapter.js这个文件需要替换,或者自行修改,替换3.x得; 2.unity导包出得模型文件命名需要注意,避免太长,路径也不…

敏感个人信息识别指南正式版发布,个人信息保护合规要求更明确

9月14日,全国网络安全标准化技术委员会秘书处发布《网络安全标准实践指南——敏感个人信息识别指南》。 2020 年发布的国标文件 GB/T 35273《信息安全技术 个人信息安全规范》中提到关于敏感个人信息的示例,本次公开的《敏感个人信息识别指南》详细规定了…

黑神话悟空mac可以玩吗

黑神话悟空mac上能不能玩对于苹果玩家来说很重要,那么黑神话悟空mac可以玩吗?目前是玩不了了,没有针对ios系统的版本,只能之后在云平台上找找了,大家可以再观望下看看。 黑神话悟空mac可以玩吗 ‌使用CrossOver‌&…

SpringBoot2:web开发常用功能实现及原理解析-上传与下载

文章目录 一、上传文件1、前端上传文件给Java接口2、Java接口上传文件给Java接口 二、下载文件1、前端调用Java接口下载文件2、Java接口下载网络文件到本地3、前端调用Java接口下载网络文件 一、上传文件 1、前端上传文件给Java接口 Controller接口 此接口支持上传单个文件和…

CSS传统布局方法(补充)——WEB开发系列37

开发技术不断演进,布局方式也经历了多个阶段的变革。从最初的基于表格布局到 CSS 的浮动布局,再到今天的弹性盒(Flexbox)与 CSS Grid 网格布局,每一种布局方式都有其独特的背景和解决特定问题的优势。 一、CSS Grid 出…

详解x86汇编指令:test edx, edx

前言 有不少新手在学习汇编指令的时候可能会被网上一些人误导(很显然我就被误导了),认为test与cmp指令相同,都是在比较两个值是否相同的,那么来看这两个指令: test edx,edx jne 0040BCA3jne 指令为不等于0…

应用层协议——http

目录 http 介绍 urlencode / urldecode http 请求与响应格式 1 请求 2 响应 http 状态码 长连接 会话保持 调试 http 的一些基本工具 telnet postman fidller http 介绍 针对常见场景,早已有大佬们写好了对应的协议,最典型的就是 http 和 ht…

Prometheus 上手指南

文章目录 Prometheus 相关概念Prometheus 的特点Prometheus 架构数据模型 Datemode使用场景 指标类型 Metric type适用场景 作业和实例 Jobs and instances使用场景 Prometheus 安装Prometheus 配置prometheusalertmanager Grafana 可视化Grafana 安装Grafana 配置选项Grafana …