Qt Model/View概述

概述

Qt包含了一组item view类,它们使用模型/视图架构来管理数据之间的关系以及呈现给用户的方式。该体系结构引入的功能分离为开发人员提供了更大的灵活性来定制项目的表示,并提供了一个标准的模型接口,以允许广泛的数据源与现有项目视图一起使用。在本文中,我们简要介绍了模型/视图范式,概述了所涉及的概念,并描述了项目视图系统的体系结构。对架构中的每个组件都进行了解释,并给出了如何使用所提供的类的示例。

模型/视图架构

模型-视图-控制器(Model-View-Controller, MVC)是一种源自Smalltalk的设计模式,经常用于构建用户界面。在《设计模式》一书中,Gamma等人写道:

  • MVC由三种对象组成。模型是应用程序对象,视图是它的屏幕显示,控制器定义了用户界面对用户输入的反应方式。在使用MVC之前,用户界面设计倾向于将这些对象放在一起。MVC将它们解耦以提高灵活性和重用性。

如果视图和控制器对象被组合,结果就是模型/视图架构。这仍然将数据的存储方式和呈现给用户的方式分开,但基于相同的原则提供了一个更简单的框架。这种分离使得可以在多个不同的视图中显示相同的数据,并实现新的视图类型,而无需更改底层数据结构。为了灵活地处理用户输入,我们引入了委托的概念。在这个框架中使用委托的好处是,它允许自定义数据项的渲染和编辑方式。

模型/视图架构

该模型与数据源进行通信,为架构中的其他组件提供接口。通信的性质取决于数据源的类型,以及模型的实现方式。

视图从模型中获取模型索引;这些是对数据项的引用。通过向模型提供模型索引,视图可以从数据源检索数据项。

在标准视图中委托渲染数据项。当一个项目被编辑时,委托使用模型索引直接与模型通信。

一般来说,模型/视图类可以分为上面描述的三组:模型、视图和委托。每个组件都由提供公共接口的抽象类定义,在某些情况下,还提供功能的默认实现。抽象类旨在被子类化,以便提供其他组件所期望的全套功能;这也允许编写专用组件。

模型、视图和委托使用信号(signal)和槽(slot)相互通信:

  • 来自模型的信号通知视图关于数据源所持有的数据的更改。
  • 来自视图的信号提供了关于用户与正在显示的项目交互的信息。
  • 来自委托的信号在编辑过程中用于告诉模型和视图关于编辑器的状态。

模型

所有item模型都基于QAbstractItemModel类。这个类定义了一个接口,视图和委托使用该接口访问数据。数据本身并不一定要存储在模型中;它可以保存在由单独的类、文件、数据库或其他应用程序组件提供的数据结构或存储库中。

模型类一节将介绍模型的基本概念。

QAbstractItemModel提供了一个数据接口,它足够灵活,可以处理以表、列表和树的形式表示数据的视图。然而,在为列表和类似表格的数据结构实现新模型时,QAbstractListModel和QAbstractTableModel类是更好的起点,因为它们提供了通用函数的适当默认实现。这些类都可以子类化,以提供支持特定类型列表和表的模型。

在创建新模型一节中讨论了模型的子类化过程。

Qt提供了一些现成的模型来处理数据项:

  • QStringListModel用于存储一个简单的QString元素列表。
  • QStandardItemModel管理更复杂的项目树结构,每个项目可以包含任意数据。
  • QFileSystemModel提供了关于本地文件系统中的文件和目录的信息。
  • QSqlQueryModel、qsqlltablemodel和QSqlRelationalTableModel按模型/视图约定访问数据库。

如果这些标准模型不能满足您的需求,您可以子类化QAbstractItemModel, QAbstractListModel, or QAbstractTableModel 来创建您自己的自定义模型。

视图

为不同类型的视图提供了完整的实现:QListView显示项目列表,QTableView显示表中来自模型的数据,QTreeView显示分层列表中的数据模型项。这些类都基于QAbstractItemView抽象基类。虽然这些类是现成的实现,但它们也可以子类化以提供自定义视图。

可用的视图将在视图类一节中介绍。

委托

QAbstractItemDelegate是模型/视图框架中代理的抽象基类。默认的委托实现由QStyledItemDelegate提供,它被Qt的标准视图用作默认委托。然而,QStyledItemDelegate和QItemDelegate是绘图的独立替代方案,并为视图中的项目提供编辑器。它们之间的区别在于,QStyledItemDelegate使用当前样式来绘制它的项。因此,在实现自定义委托或使用Qt样式表时,我们建议使用QStyledItemDelegate作为基类。

委托在委托类一节中描述。

排序

在模型/视图架构中有两种排序方法;选择哪种方法取决于你的基础模型。

如果你的模型是可排序的,即如果它重新实现了QAbstractItemModel::sort()函数,QTableView和QTreeView都提供了一个API,允许你以编程方式对模型数据进行排序。此外,您可以启用交互式排序(即允许用户通过单击视图的标题对数据进行排序),通过分别将QHeaderView::sortIndicatorChanged()信号连接到QTableView::sortByColumn()插槽或QTreeView::sortByColumn()插槽。

另一种方法是,如果你的模型没有所需的接口,或者你想使用列表视图来显示数据,则在视图中显示数据之前,使用代理模型来转换模型的结构。这在代理模型一节中有详细介绍。

方便类

为了让依赖于Qt基于item的item view和table类的应用程序受益,许多便利类都派生自标准视图类。它们不打算被子类化。

这些类的例子包括QListWidget、QTreeWidget和QTableWidget

这些类不如视图类灵活,不能与任意模型一起使用。我们建议你使用model/view方法来处理item视图中的数据,除非你非常需要一组基于item的类。

如果你想利用模型/视图方法提供的特性,同时仍然使用基于item项的接口,可以考虑使用视图类,例如QListView、QTableView和QTreeView与QStandardItemModel(推荐)。

使用模型和视图

接下来的几节解释如何在Qt中使用model/view模式。每一节都包含一个示例,然后还有一节展示如何创建新组件。

Qt包含两种模型

Qt提供的两个标准模型是QStandardItemModel和QFileSystemModel。QStandardItemModel是一个多用途模型,可用于表示列表、表和树视图所需的各种不同的数据结构。这个模型还保存了数据项(item)。QFileSystemModel是一个维护目录内容信息的模型。因此,它本身不保存任何数据项,只是表示本地文件系统上的文件和目录。

QFileSystemModel提供了一个现成的模型来进行实验,可以很容易地配置以使用现有数据。使用这个模型,我们可以展示如何为现成的视图设置模型,并探索如何使用模型索引操作数据。

在现有模型中使用视图

QListView和QTreeView类是最适合与QFileSystemModel一起使用的视图。下面给出的示例在树视图中显示目录的内容,与列表视图中的相同信息相邻。这两个视图共享用户的选择,因此选中的项目在两个视图中都被突出显示。

我们设置了一个QFileSystemModel,以便可以使用,并创建了一些视图来显示目录的内容。这展示了使用模型的最简单方法。模型的构造和使用是在一个main()函数中完成的:

int main(int argc, char *argv[])
{QApplication app(argc, argv);QSplitter *splitter = new QSplitter;QFileSystemModel *model = new QFileSystemModel;model->setRootPath(QDir::currentPath());

该模型被设置为使用来自某个文件系统的数据。对setRootPath()的调用告诉模型要向视图公开文件系统上的哪个驱动器。
我们创建了两个视图,以便我们可以以两种不同的方式检查模型中保存的项:

    QTreeView *tree = new QTreeView(splitter);tree->setModel(model);tree->setRootIndex(model->index(QDir::currentPath()));QListView *list = new QListView(splitter);list->setModel(model);list->setRootIndex(model->index(QDir::currentPath()));

视图的构造方式与其他部件相同。要想在视图中显示模型中的项目,只需调用它的setModel()函数,将目录模型作为参数即可。我们在每个视图上调用setRootIndex()函数,从文件系统模型中为当前目录传入一个合适的模型索引,从而过滤模型提供的数据。

这里使用的index()函数是QFileSystemModel唯一的。我们给它提供一个目录,它会返回一个模型索引。模型索引在模型类中讨论。

函数的其余部分只是显示splitter部件中的视图,并运行应用程序的事件循环:

    splitter->setWindowTitle("Two views onto the same file system model");splitter->show();return app.exec();
}

在上面的例子中,我们忽略了如何处理元素的选择。在Item视图中处理选择的部分会更详细地介绍这个主题。Handling Selections in Item Views.

Model/View Programming | Qt Widgets 5.15.17

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

独立站新纪元:破局而出,共绘可持续发展蓝图

随着全球电商市场的日益繁荣与平台竞争的加剧,独立站作为商家自主掌控品牌与市场的桥头堡,正面临着前所未有的挑战与机遇。在这个瞬息万变的时代,如何在平台垄断的阴影下突围而出,实现可持续增长,成为了每一位独立站商家亟需解答的课题。为此,店匠科技( Shoplazza ) 将于 9月 2…

【MySQL】查询表中重复数据、模糊查询列信息、快速copy表数据(1)

一、SQL查询重复的数据: 1、SQL格式: Select * From 数据表 Where 重复记录字段 in ( select 重复记录字段 From 数据表 Group By 重复记录字段 Having Count(重复记录字段)>1) 2、举例: 在这个patient_member_info表中,我们…

【Hot100】LeetCode—62. 不同路径

目录 1- 思路题目识别动规五部曲 2- 实现⭐62. 不同路径——题解思路 3- ACM 实现 原题链接:62. 不同路径 1- 思路 题目识别 识别1 :给一个二维矩阵,每次只能向下或者向右移动一步识别2:求解到达最右下角的路径数。 动规五部曲…

编写XBOX控制器实现鼠标键盘输入

1.核心部分, XINPUT输入封装 XInput封装https://mp.csdn.net/mp_blog/creation/editor/1420701282.对话框窗口编写 Win32 对话框封装-CSDN博客https://blog.csdn.net/Flame_Cyclone/article/details/142110008?spm1001.2014.3001.5501 3.使用到的其他封装 字符串编码转换与…

灰色关联度/模糊聚类/最邻近算法KNN/随机森林RF/极限学习机

一、灰色关联度 简介: 对于两个系统之间的因素,其随时间或不同对象而变化的关联性大小的量度,称为关联度。在系统发展过程中,若两个因素变化的趋势具有一致性,即同步变化程度较高,即可谓二者关联程度较高…

【C++】认识C++(前言)

🦄个人主页:小米里的大麦-CSDN博客 🎏所属专栏:C_小米里的大麦的博客-CSDN博客 🎁代码托管:C: 探索C编程精髓,打造高效代码仓库 (gitee.com) ⚙️操作环境:Visual Studio 2022 目录 一、本节概述 二、什么是C 三、C发展史 四…

Python画笔案例-044 绘制四米围方

1、绘制 四米围方 通过 python 的turtle 库绘制 四米围方,如下图: 2、实现代码 绘制 四米围方,以下为实现代码: """四米围方.py """ import turtledef draw_mi():"""画米字图形&qu…

关于武汉芯景科技有限公司的IIC缓冲器芯片XJ4307开发指南(兼容LTC4307)

一、芯片引脚介绍 1.芯片引脚 2.引脚描述 二、系统结构图 三、功能描述 1.总线超时,自动断开连接 当 SDAOUT 或 SCLOUT 为低电平时,将启动内部定时器。定时器仅在相应输入变为高电平时重置。如果在 30ms (典型值) 内没有变为高…

开展文化创新与传承 全球老子圣像评选启动

9月11日,在刚见证了中华社会文化发展基金会老子文化公益基金成立发布会盛典的中华文化园,又迎来了中华社会文化发展基金会领导的亲临指导。本次指导由中华社会文化发展基金会执行副秘书长蒋晔带队,魏欣主任和高凯主任同行,共同考察…

JMeter脚本开发

环境部署 Ubuntu系统 切换到root用户 sudo su 安装上传下载的命令 apt install lrzsz 切换文件目录 cd / 创建文件目录 mkdir java 切换到Java文件夹下 cd java 输入rz回车 选择jdk Linux文件上传 解压安装包 tar -zxvf jdktab键 新建数据库 运行sql文件 选择sql文件即…

微信小程序原生支持TS、LESS、SASS能力探究

文章目录 原生支持开始使用旧项目新建项目TS声明文件更新 功能说明less 使用全局变量sass 使用全局变量 可以参考原文 在之前开发小程序中,无法使用 less/sass 等 css 预编译语言,也无法使用 TS 进行开发,但在最新的编辑器版本中&#xff0c…

Running setup.py install for wxPython did not run successfully.

Running setup.py install for wxPython did not run successfully. 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰,211科班出身,就职于医疗科技公司,热衷分享知识,武汉城市开…

【Prompt Enhancer】如何优化prompt的内容

背景 在使用LLM的时候,提示词的好坏对模型的输出质量影响很大,提示词又是一个复杂工程,要写出优秀的提示词,需要丰富的经验。正因如此,各类Agent平台都会有自己的提示词增强功能,帮助用户编写提示词。 最…

java项目之基于Spring Boot智能无人仓库管理源码(springboot+vue)

项目简介 智能无人仓库管理实现了以下功能: 基于Spring Boot智能无人仓库管理的主要使用者分为: 管理员的功能有:员工信息的查询管理,可以删除员工信息、修改员工信息、新增员工信息 💕💕作者&#xff1a…

WebGL系列教程六(纹理映射与立方体贴图)

目录 1 前言2 思考题3 纹理映射介绍4 怎么映射?5 开始绘制5.1 声明顶点着色器和片元着色器5.2 修改顶点的颜色为纹理坐标5.3 指定顶点位置和纹理坐标的值5.4 获取图片成功后进行绘制5.5 效果5.6 完整代码 6 总结 1 前言 上一讲我们讲了如何使用索引绘制彩色立方体&a…

基于SpringBoot+Vue+MySQL的画师约稿平台系统

系统展示 用户界面 画师界面 管理员界面 系统背景 基于SpringBootVueMySQL的画师约稿平台系统的背景,主要源于数字艺术行业的快速发展与画师、客户双方需求的日益增长。在传统的约稿方式中,往往存在沟通效率低下、交易过程不透明等问题,这限制…

C++---string类常见接口

介绍 string类详情>>>https://cplusplus.com/reference/string/string/?kwstring 1. string是表示字符串的字符串类(感觉就像一个动态的字符数组) 2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作…

Cloudflare Pages 部署 Next.js 应用教程

Cloudflare Pages 部署 Next.js 应用教程 本教程将指导你如何将现有的 Next.js 应用部署到 Cloudflare Pages。 准备工作 安装部署依赖 首先,安装 cloudflare/next-on-pages: npm install --save-dev cloudflare/next-on-pages添加 wrangler.toml 配置文件 在项目根目录创建 …

力扣139-单词拆分(Java详细题解)

题目链接:139. 单词拆分 - 力扣(LeetCode) 前情提要: 因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。 最近刚学完背包,所以现在的题解都是以背包问题为基础再来写的。 如果大家不懂背包问题的话&#…

【LoRA】浅谈大模型微调之LoRA技术

在当今的信息时代中,大型语言模型扮演着至关重要的角色,它们在自然语言处理任务中展现出强大的能力。LoRA,英文全称Low-Rank Adaptation of Large Language Models,是一种用于微调大型语言模型的低秩适应技术,由微软的…