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

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

文章目录

  • 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()请求索引时为父项指定了无效的模型索引,则返回的索引将引用模型中的顶级项。
  • 角色区分与项目关联的不同类型的数据。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【自动驾驶】决策规划算法(一)决策规划仿真平台搭建 | Matlab + Prescan + Carsim 联合仿真基本操作
  • 信息安全工程师(8)网络新安全目标与功能
  • Python 如何调用讯飞星火大模型API
  • 【前端】ES6:Promise对象和Generator函数
  • 深度学习自编码器 - 自编码器的应用篇
  • 木舟0基础学习Java的第二十九天(Spring,Spring的属性注入(xml,注解))
  • 编译成功!QT/6.7.2/Creator编译Windows64 MySQL驱动(MinGW版)
  • leetcode第十四题:最长公共前缀
  • CTC loss 博客转载
  • 鸿蒙【项目打包】- .hap 和 .app;(测试如何安装发的hap包)(应用上架流程)
  • 【机器学习】--- 自然语言推理(NLI)
  • 巨人网络参展云栖大会,两款“游戏+AI”自研大模型应用首发
  • docker之自定义镜像上传至阿里云
  • 山体滑坡检测系统源码分享
  • 力扣(leetcode)每日一题 2374 边积分最高的节点
  • 【Leetcode】101. 对称二叉树
  • CSS 专业技巧
  • IDEA常用插件整理
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • js递归,无限分级树形折叠菜单
  • JS实现简单的MVC模式开发小游戏
  • js正则,这点儿就够用了
  • Laravel 实践之路: 数据库迁移与数据填充
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • Shell编程
  • Spring-boot 启动时碰到的错误
  • springMvc学习笔记(2)
  • Unix命令
  • Vue.js 移动端适配之 vw 解决方案
  • 关于Java中分层中遇到的一些问题
  • 回顾 Swift 多平台移植进度 #2
  • 理清楚Vue的结构
  • 前端性能优化--懒加载和预加载
  • 如何在 Tornado 中实现 Middleware
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 新书推荐|Windows黑客编程技术详解
  • NLPIR智能语义技术让大数据挖掘更简单
  • ​一些不规范的GTID使用场景
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (2)STM32单片机上位机
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (C语言)逆序输出字符串
  • (rabbitmq的高级特性)消息可靠性
  • (zt)最盛行的警世狂言(爆笑)
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (强烈推荐)移动端音视频从零到上手(上)
  • (三)mysql_MYSQL(三)
  • (新)网络工程师考点串讲与真题详解
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • ./configure,make,make install的作用(转)
  • .bat批处理(五):遍历指定目录下资源文件并更新