QT 视图(View)/委托(Delegate)/ 模型(Model)/项(Item) 之间的关系

2023-05-16

引言

在学习Qt 中此部分的使用是界面自定义出美观的重要部分,熟练的使用,可以制作出很好的效果,在此梳理一下他们的关系。

Model/View(模型/视图)

  • **视图(View)**是显示和编辑数据的界面组件
  • **模型(Model)**是视图与原始数据之间的接口。
    在QT中提供了以下几种预定义模型:

在这里插入图片描述
常用的视图类层次结构,如下所示:

在这里插入图片描述

在Qt中,不管模型以什么结构组织数据,都必须为每个数据提供不同的索引值,使得视图能通过索引值访问模型中的具体数据

对于不同的模型视图而言,row(行)、column(列)、parent(父索引)的效果如下所示:
三元组row、column、parent

项(Item)

  • 不管数据模型的表现形式是怎么样的,数据模型中存储数据的基本单元都是项(item)每个项有一个行号、一个列号,还有一个父项。
  • 在列表和表格模式下,所有的项都有一个相同的顶层项;在树状结构中,行号、列号、父项稍微复杂一点,但是由这 3 个参数完全可以定义一个项的位置,从而存取项的数据。

模型索引(model index)

通过index获取item

为了保证数据的表示与数据存取方式隔离,数据模型中引入了模型索引的概念。通过数据模型存取的每个数据都有一个模型索引,视图组件和代理都通过模型索引来获取数据。

QModelIndex
表示模型索引的类。模型索引提供数据存取的一个临时指针,用于通过数据模型提取或修改数据。因为模型内部组织数据的结构随时可能改变,所以模型索引是临时的。如果需要使用持久性的模型索引,则要使用QPersistentModelIndex 类。
行号和列号
数据模型的基本形式是用行和列定义的表格数据,但这并不意味着底层的数据是用二维数组存储的,使用行和列只是为了组件之间交互方便的一种规定。通过模型索引的行号和列号就可以存取数据。

要获得一个模型索引,必须提供 3 个参数:行号、列号、父项的模型索引。
例如,对于如图 中的表格数据模型中的 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());

父项

当数据模型是列表或表格时,使用行号、列号存储数据比较直观,所有数据项的父项就是顶层项;当数据模型是树状结构时,情况比较复杂(树状结构中,项一般习惯于称为节点),一个节点可以有父节点,也可以是其他节点的父节点,在构造数据项的模型索引时,必须指定正确的行号、列号和父节点。
对于图 中的树状数据模型,节点 A 和节点 C 的父节点是顶层节点,获取模型索引的代码是:

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

但是,节点 B 的父节点是节点 A,节点 B 的模型索引由下面的代码生成:

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

项的角色

在为数据模型的一个项设置数据时,可以赋予其不同项的角色的数据。例如,数据模型类 QStandardItemModel 的项数据类是 QStandardItem,其设置数据的函数是:

void QStandardItem::setData(const QVariant &value, int role= Qt::UserRole + 1)

其中,value 是需要设置的数据,role 是设置数据的角色。一个项可以有不同角色的数据,用于不同的场合。

Qt::DisplayRole 0 以文本方式显示数据(QString)
Qt::DecorationRole 1 将数据作为图标来装饰(QIcon,QPixmap)
Qt::EditRole 2 可编辑的数据信息显示(QString)
Qt::ToolTipRole 3 作为工具提示显示(QString)
Qt::StatusTipRole 4 作为状态栏中显示的数据(QString)
Qt::WhatsThisRole 5 作为帮助信息栏中显示的数据(QString)
Qt::FontRole 6 设置字体(QFont)
Qt::TextAlignmentRole 7 设置模型数据的文本对齐(Qt::AlignmentFlag)
Qt::BackgroundRole 8 设置模型数据的背景色(QBrush)
Qt::ForegroundRole 9 设置模型数据的前景色,比如字体(QBrush)

在获取一个项的数据时也需要指定角色,以获取不同角色的数据:

QVariant QStandardItem::data(int role = Qt::UserRole + 1) const

代理(Delegate)

代理就是在视图组件上为编辑数据提供编辑器
如在表格组件中编辑一个单元格的数据时,缺省是使用一个 QLineEdit编辑框。代理负责从数据模型获取相应的数据,然后显示在编辑器里,修改数据后,又将其保存到数据模型中。

QAbstractltemDelegate 是所有代理类的基类,作为抽象类,它不能直接使用。它的一个子类
QStyledltemDelegate,是 Qt 的视图组件缺省使用的代理类。

对于一些特殊的数据编辑需求,例如只允许输入整型数,使用一个 QSpinBox 作为代理组件更恰当,从列表中选择数据时使用一个
QComboBox 作为代理组件更好。这时,就可以从 QStyledltemDelegate 继承创建自定义代理类。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT 视图(View)/委托(Delegate)/ 模型(Model)/项(Item) 之间的关系 的相关文章

  • 从 C# 对象自动生成 javascript 对象模型

    寻找现有的 经过验证的解决方案来快速生成客户端JavaScript 对象模型代表一个现有的 C 对象 我想象有一个 T4 模板或其他一些方法 但我缺乏找到它的术语 我不是在讨论序列化以获取现有 C 对象实例的 JSON 表示形式或任何与反序
  • zend 模型架构

    假设我的数据库中有两个表 项目和用户 我创建了两个扩展 Zend Db Table Abstract 的模型 Model DbTable Users and Model DbTable Projects 现在 创建一个实例是一个好的模式吗
  • Laravel 5.1:将数据传递给 View Composer

    我在 Laravel 5 1 中使用视图编辑器 很好 但是如何将参数传递给视图编辑器 就我而言 我将周信息 上周 当前 下周 包括日期 发送到我的视图中 并使用 de viewcomposer 当前星期是可变的 不仅来自 url 还来自控制
  • 只有创建视图层次结构的原始线程才能触摸其视图错误

    一切正常 除非到达代码的最后部分 注册成功 然后标题中提到的错误出现在registerDialog消息部分中 我做错了什么吗 谁能帮我检查我的代码 非常感谢 该应用程序没有崩溃 尽管它只是退出回到应用程序主页 如果我再次按下注册按钮 它将返
  • Django与领域和自身的多对多关系独特

    我尝试使用语言和内容创建帖子 并将其与同一页面的其他版本相关联 但我陷入困境 class Page models Model content models TextField language models CharField max le
  • 无法销毁多对多关系中的记录

    我是 Rails 新手 所以我确信我犯了一个简单的错误 我在两个模型之间建立了多对多关系 User and Group 它们通过连接模型连接GroupMember 这是我的模型 删除了不相关的内容 class User lt ActiveR
  • 在页面上显示 # 个视图,而无需始终访问数据库

    越来越多的网站显示某些页面收到的浏览量 以及点击次数 如 dzone com 跟踪视图而不每次加载都访问数据库的最佳实践是什么 我脑子里有很多关于如何做到这一点的潜在想法 但似乎没有一个可行 谢谢 首次使用的用户 我会首先尝试数据库方法 返
  • 如何确定视图的列是派生的还是常量?

    假设我有下表 create table t Item ItemID int not null identity 1 1 constraint PK Item primary key Description varchar 256 not n
  • Django 在模板中显示 render_to_response

    您好 提前谢谢您 我知道这完全是菜鸟问题 我已经在各个论坛中进行了搜索并阅读并重新阅读了文档 所以请保持温和 我有一个看法 views py from django shortcuts import render to response f
  • 多表继承模型和相同两个模型之间的简单一对一关系有什么区别?

    这些实现之间有什么区别 Django 有何不同 除了继承 Metaordering and get latest by属性 1 models py from django db import models class Place model
  • 在 RoR 视图中获取 {{attribute}} {{message}}

    登录 1 个错误禁止保存此 model 以下字段存在问题 属性 消息 这是查看代码 h1 Login h1 br br br br br br
  • 从传递给分部视图的嵌套复杂对象中获取值

    我有一个 ViewModel 它的成员之一是一个复杂的对象 复杂对象有 4 个属性 都是字符串 我正在尝试创建一个可重用的部分视图 我可以在其中传递复杂的对象并让它使用 html 帮助器为其属性生成 html 这一切都很好 但是 当我提交表
  • 如何将 Request->all() 与 Eloquent 模型一起使用

    我有一个 lumen 应用程序 需要在其中存储传入的 JSON 请求 如果我写这样的代码 public function store Request request if request gt isJson data request gt
  • 调用 Pyramid 中的另一个视图

    我的目标 在 Pyramid 中 调用另一个可调用视图 并获得一个Response在不知道有关该视图可调用的任何详细信息的情况下拒绝返回 在我的 Pyramid 应用程序中 假设我有一个使用 view config 装饰器定义的视图 foo
  • Rails 如何处理模型中的错误和异常

    所以我使用 twitter 库解析 Rails 中 twitter api 的数据 有时 api 的响应可能是这样的 error Invalid parameter 模型会引发异常 现在我默默地捕获它并将 error message 放入日
  • 在屏幕上滑动手指激活按钮,就像按下按钮一样

    如果我的标题不够清楚 我会详细解释一下 假设我们有一个充满多个按钮 10 多个 的屏幕 我们按下一个按钮 激活 onTouch onClick 如果我们现在移动手指而不抬起它 我希望它激活它滑过的任何其他按钮 在这种特殊情况下 我希望当您滑
  • Laravel 5 Blade 在出现错误时显示空白页而不是抛出异常

    在 laravel 4 中 当你尝试渲染一个不存在的视图时应用程序 视图或者带有未定义变量的视图 laravel 将抛出异常或显示有助于调试的错误 我全新安装了 laravel 5 0 13 并且在对刀片模板进行故障排除时遇到了困难 该模板
  • 掌握 CodeIgniter - 模板化/加载视图

    尝试学习 CI 并浏览文档以获得更好的理解 如果没有单独的库 我可以通过包含视图列表来制作模板 如下所示 this gt load gt view header this gt load gt view navigation this gt
  • 向 Rails 中的所有活动链接添加“活动”类?

    基本上 我有很多类似这样的代码 link to t profile business path business class active if current page business path business 这不是很干 我想知道是
  • MVC 模型在 OnExecuted 操作过滤器中为 null ...或者设置模型的更优雅的方式?

    我有一个 ActionFilter 它覆盖了 OnActionExecuted 方法 在 POST 操作中 filterContext Controller ViewData Model 始终为 null 我确实发现下面的文章似乎在说它不应

随机推荐

  • freeRTOS系统栈与任务栈

    中断过来之后 xff0c 由任务栈切换到main stack xff08 系统栈 xff09 任务栈保存 系统栈的地址范围为0xfede8000 4K xff0c 向下生长 xff0c 所以按照ld的定义 xff0c 0xfede9000
  • ROS下上位机和stm32单片机通信

    1 需要实例化串口节点建立监听者listener和发布之publisher 2 上位机通过游戏手柄发布自定义消息类型control int64 mode 手柄模式切换 int64 lidar 雷达数据 int64 gamePad x 控制前
  • 奇偶校验码

    偶校验为例 xff1a 例图中 xff0c 下划线为校验位 xff0c 其余为信息位 检错步骤如下 xff1a 1 根据信息位算出校验位 xff08 通过异或运算 xff1a 相同为0 xff0c 不同为1 xff09 xff1a 得出校验
  • C++中#define和const的区别

    一 define是预处理指令 xff08 pre processor directive xff09 而const是关键字 define用于给一些值定义名称 字符串 xff0c 这样定义的字符串在C C 43 43 中称为宏定义 xff0c
  • select函数实现tcp服务器与客户端随时收发

    服务器 include lt stdio h gt include lt sys types h gt include lt sys socket h gt include lt arpa inet h gt include lt neti
  • STM32F10X库函数逻辑

    define PERIPH BASE unsigned int 0x40000000 定义外围总线基地址 define APB1PERIPH BASE PERIPH BASE xff09 APB1总线开始与外围总线基地址 define AP
  • STM32F10x外部中断EXTI

    目录 一 EXTI是什么 xff1f 二 使用方法 1 功能框图及寄存器 2 库函数编程 总结 提示 xff1a 以下是本篇文章正文内容 xff0c 下面案例可供参考 一 EXTI是什么 xff1f EXTI External interr
  • QT + OpenGL + FFmpeg写的一个全景视频播放器

    临时被分配了一个任务 写一个C 43 43 版本的全景视频播放器 网上搜了搜 基于前辈的基础上 写的差不多了 测试视频源是用ffmpeg拉RTSP的流 最终是要嵌入到别的一个视频播放器模块 所以解码这块我不用太关注 只要实现渲染就可以了 效
  • 15 侥幸:在随机性面前处变不惊

    引言 之前讲过的量化思维 xff0c 已经有概率思维的影子了 xff0c 开始学着用数字提高认识世界的分辨率 现在将继续加深对概率的理解 xff0c 来探讨随机性 它解决的人生难题是 xff1a 我们时常因为心存侥幸而失败 在随机的世界里
  • 【无人驾驶】自动驾驶领域有哪些岗位可选?

    导读 想要进入自动驾驶这个领域 xff0c 便首先去调查了下这个领域的岗位 xff0c 希冀能从中找出自己最感兴趣且匹配度也比较高的方向 废话不多说 xff0c 见下 下图为自动驾驶方向的所有岗位 xff0c 总量的来说 xff0c 方向可
  • 01_搭建百度apollo环境实操可用

    搭建百度apollo环境 0 前言1 目标2 方法3 Apollo环境搭建3 1 CPU版3 1 1前置依赖硬件条件3 2 GPU版前置依赖软件1 安装 Ubuntu 18 042 安装 GIT3 安装 Docker 引擎 3 1 3克隆
  • 02_两小时了解自动驾驶

    02 两小时了解自动驾驶 目标你将学到什么什么是无人驾驶无人驾驶的运作方式参考车辆与硬件平台开源软件架构仿真环境地图简介高精地图与传统地图地图与定位 感知 规划的关系高精地图定位简介GNSS RTK惯性导航激光雷达定位视觉定位融合定位感知简
  • PCA9555的使用个人总结

    1 德州仪器PCA9555 简化PCB布线 xff0c 对处理器有限的IO口进行补充 2 带中断 xff0c 不带重启 3 24 引脚的CMOS器件 xff0c 提供I2C SMBus16位通用并行 xff08 GPIO xff09 的扩展
  • stm32掉电前的数据存储到flash

    对FLASH 的操作 FLASh 必须是先擦 后 写 下面的函数是分析案例 void FLASH WriteByte u32 addr u16 flashdata1 FLASH Status FLASHstatus 61 FLASH COM
  • SPI对外部w25Q64的读写

    SPI 1 SPI是串行外围设备接口 SPI的接口主要应用在EEPROM xff0c FLASH xff0c 实时时钟 xff0c AD 转换器 xff0c 还有数字信号处理器和数字信号 解码器之间 2 SPI xff0c 是一种高速的 x
  • Qt实战开发-仪表盘制作

    仪表盘制作 相关的基础知识 QPainter用来执行具体的绘图相关的操作 xff0c 用来画点 xff0c 线 xff0c 填充 xff0c 变换 xff0c alpha 阿尔法通道 xff08 透明度 xff09 Appha的值越大 xf
  • Qt实战开发-数字软键盘

    开发的思路 布局键盘界面每一个button对应一个槽函数把输入的字符返回到点击处的文本编辑框 开发过程首先定义功能button xff0c 在头文件中定义 QString getText QPushButton span class hlj
  • Qt图形视图框架封装-拿来就用

    简述 图形视图 xff08 Graphics View xff09 提供了一个平台 xff0c 用于大量自定义2D图元的管理与交互 xff0c 并提供了一个视图部件 xff08 view widget xff09 来显示可以缩放和旋转的图元
  • 带参数的宏定义

    带参数的宏定义的一般形式如下 xff1a define lt 宏名 gt xff08 lt 参数表 gt xff09 lt 宏体 gt 其中 xff0c lt 宏名 gt 是一个标识符 xff0c lt 参数表 gt 中的参数可以是一个 x
  • QT 视图(View)/委托(Delegate)/ 模型(Model)/项(Item) 之间的关系

    引言 在学习Qt 中此部分的使用是界面自定义出美观的重要部分 xff0c 熟练的使用 xff0c 可以制作出很好的效果 xff0c 在此梳理一下他们的关系 Model View xff08 模型 视图 xff09 视图 xff08 View