Qt 模型视图(三):视图类QAbstractItemView

文章目录

  • Qt 模型视图(三):视图类`QAbstractItemView`
    • 1.基本概念
      • 1.1.使用现有视图
      • 1.2.使用模型
      • 1.3.使用模型的多个视图
      • 1.4.在视图之间共享选择

Qt 模型视图(三):视图类QAbstractItemView

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

1.基本概念

在模型/视图架构中,视图从模型中获取数据项并将其呈现给用户。数据的呈现方式不需要类似于模型提供的数据表示,并且可能与用于存储数据项的底层数据结构完全不同。
内容和表示的分离是通过使用QAbstractItemModel提供的标准模型接口、QAbstractItem view提供的标准视图接口以及使用以通用方式表示数据项的模型索引来实现的。视图通常管理从模型中获得的数据的总体布局。他们可以自己渲染单个数据项,也可以使用委托来处理渲染和编辑功能。
除了显示数据外,视图还处理项目之间的导航以及项目选择的某些方面。这些视图还实现了基本的用户界面功能,如上下文菜单和拖放。视图可以为项目提供默认编辑功能,也可以与代理一起提供自定义编辑器。
可以在没有模型的情况下构建视图,但必须提供模型才能显示有用信息。视图通过使用选项来跟踪用户选择的项目,这些选项可以为每个视图单独维护,也可以在多个视图之间共享。
某些视图(如QTableView和QTreeView)显示标题和项目。这些也由视图类QHeaderView实现。标头通常访问与包含它们的视图相同的模型。它们使用QAbstractItemModel::headerData()函数从模型中检索数据,通常以标签的形式显示标题信息。可以从QHeaderView类中子类化新标题,为视图提供更专业的标签。

1.1.使用现有视图

Qt提供了三个即用型视图类,以大多数用户熟悉的方式呈现模型中的数据。列表视图QListView可以将模型中的项目显示为简单的列表,也可以以经典图标视图的形式显示。树状视图QTreeView将模型中的项目显示为列表层次结构,允许以紧凑的方式表示深度嵌套的结构。表格视图QTableView以表格的形式显示模型中的项目,非常类似于电子表格应用程序的布局。
在这里插入图片描述
上面显示的标准视图的默认行为应该足以用于大多数应用程序。它们提供基本的编辑功能,可以定制以满足更专业的用户界面的需求。

1.2.使用模型

我们将创建的字符串列表模型作为示例模型,使用一些数据对其进行设置,并构建一个视图来显示模型的内容。所有这些都可以在一个函数中执行:

 int main(int argc, char *argv[])
 {
     QApplication app(argc, argv);
 // Unindented for quoting purposes:
 QStringList numbers;
 numbers << "One" << "Two" << "Three" << "Four" << "Five";
 QAbstractItemModel *model = new StringListModel(numbers);

请注意,StringListModel被声明为QAbstractItemModel。这允许我们使用模型的抽象接口,并且即使我们用不同的模型替换字符串列表模型确保代码仍然有效。
QListView提供的列表视图足以显示在字符串列表模型中的项目。我们构建视图,并使用以下代码行设置模型:

 QListView *view = new QListView;
 view->setModel(model);

视图以正常方式显示:

     view->show();
     return app.exec();
 }

视图呈现模型的内容,通过模型的接口访问数据。当用户尝试编辑项目时,视图使用默认委托提供编辑器小部件。

在这里插入图片描述

上图显示了列表视图QListView如何表示字符串列表模型中的数据。由于模型是可编辑的,因此视图会自动允许使用默认委托编辑列表中的每个项目。

1.3.使用模型的多个视图

为同一模型提供多个视图,只需为每个视图设置相同的模型即可。在下面的代码中,我们创建了两个表视图,每个视图都使用我们为本例创建的相同简单表模型:

     QTableView *firstTableView = new QTableView;
     QTableView *secondTableView = new QTableView;
     firstTableView->setModel(model);
     secondTableView->setModel(model);

在模型/视图架构中使用信号和插槽意味着对模型的更改可以传播到所有附加的视图,确保无论使用何种视图,我们都可以始终访问相同的数据。

在这里插入图片描述
上图显示了同一模型的两个不同视图,每个视图都包含多个选定项目。尽管模型中的数据在视图中显示一致,但每个视图都维护自己的内部选择模型。这在某些情况下可能很有用,但对于许多应用程序来说,共享选择模型是可取的。

处理项目选择
QItemSelectionModel类提供了处理视图中项目选择的机制。默认情况下,所有标准视图都会构建自己的选择模型,并以正常方式与它们交互。视图使用的选择模型可以通过selectionModel()函数获得,替换选择模型可以用setSelectionModel()指定。当我们希望为同一模型数据提供多个一致的视图时,控制视图所使用的选择模型的能力非常有用。
通常,除非对模型或视图进行子类化,否则不需要直接操纵选择的内容。但是,如果需要,可以访问选择模型的接口,这在“处理项目视图中的选择”中进行了探讨。

1.4.在视图之间共享选择

虽然默认情况下视图类提供自己的选择模型很方便,但当我们在同一个模型上使用多个视图时,通常希望模型的数据和用户的选择在所有视图中都一致显示。由于视图类允许替换其内部选择模型,我们可以使用以下行在视图之间实现统一选择:

secondTableView->setSelectionModel(firstTableView->selectionModel());

第二个视图给出了第一个视图的选择模型。现在,这两个视图都在相同的选择模型上运行,使数据和所选项目保持同步。

在这里插入图片描述

在上面显示的示例中,使用了两个相同类型的视图来显示同一模型的数据。然而,如果使用两种不同类型的视图,则所选项目在每个视图中的表示可能会非常不同;例如,表视图中的连续选择可以表示为树视图中突出显示的项目的片段集。

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

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

相关文章

Ubuntu22.04关闭631端口的方法

何为631端口&#xff1f; 631端口主要用于访问和控制网络打印服务&#xff0c;是linux下CUPS&#xff08;Common UNIX Printing System&#xff0c;通用UNIX打印系统&#xff09;服务的端口。Linux中的CUPS&#xff08;Common UNIX Printing System&#xff0c;通用UNIX打印系…

VisualStudio的“应用代码更改“按钮功能

无意发现这个按钮&#xff0c;因为开发这么多年也没专门尝试这个按钮&#xff0c;于是好奇它的功能。 光标放在按钮上面提示了“应用代码更改”&#xff0c;于是猜想应该是在调试不断开的情况下支持热应用更改。 经过验证&#xff0c;功能确实如同猜想的一样&#xff0c;具体验…

【Elasticsearch系列廿一】ES7 SQL 新特性

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

基于c++实现的简易shell

代码逻辑 核心思想 解析命令行&#xff0c;拆解命令及其选项创建子进程&#xff0c;在子进程中执行命令如果是前台执行命令&#xff0c;则父进程就阻塞等待子进程中命令执行结束后回收子进程的资源如果是后台执行命令&#xff0c;则父进程不进行阻塞等待&#xff0c;可继续向下…

【ArcGIS微课1000例】0123:数据库中要素类批量转为shapefile

除了ArcGIS之外的其他GIS平台,想要打开ArcGIS数据库,可能无法直接打开,为了便于使用shp,建议直接将数据库中要素类批量转为shapefile。 文章目录 一、连接至数据库二、要素批量转shp一、连接至数据库 打开ArcMap,或者打开ArcCatalog,找到数据库连接,如下图: 数据库为个…

Laravel邮件发送:从配置到发邮件的指南!

Laravel邮件发送功能如何实现&#xff1f;怎么使用Laravel发信&#xff1f; Laravel作为一款流行的PHP框架&#xff0c;提供了强大且易用的邮件发送功能。AokSend将详细介绍如何从配置到实际发送邮件的全过程&#xff0c;帮助你快速掌握Laravel邮件发送的技巧。 Laravel邮件发…

数据中台!企业的必备还是可有可无?(附数据中台构建完整脑图)

数据中台&#xff01;企业的必备还是可有可无&#xff1f;&#xff08;附数据中台构建完整脑图&#xff09; 前言数据中台 前言 在这个数据爆炸的时代&#xff0c;数据已经成为了企业最宝贵的资产之一。然而&#xff0c;如何有效地管理和利用这些数据&#xff0c;却是许多企业…

Linux驱动开发 ——架构体系

只读存储器&#xff08;ROM&#xff09; 1.作用 这是一种非易失性存储器&#xff0c;用于永久存储数据和程序。与随机存取存储器&#xff08;RAM&#xff09;不同&#xff0c;ROM中的数据在断电后不会丢失&#xff0c;通常用于存储固件和系统启动程序。它的内容在制造时或通过…

Blender软件三大渲染器Eevee、Cycles、Workbench对比解析

Blender 是一款强大的开源3D制作平台&#xff0c;提供了从建模、雕刻、动画到渲染、后期制作的一整套工具&#xff0c;广泛应用于电影、游戏、建筑、艺术等领域。 渲染101云渲染云渲6666 相比于其他平台&#xff0c;如 Autodesk Maya、3ds Max 或 Cinema 4D&#xff0c;Blende…

Error when custom data is added to Azure OpenAI Service Deployment

题意&#xff1a;在向 Azure OpenAI 服务部署添加自定义数据时出现错误。 问题背景&#xff1a; I receive the following error when adding my custom data which is a .txt file (it doesnt matter whether I add it via Azure Cognitive Search, Azure Blob Storage, or F…

药用植物的空间多组学:从生物合成途径到工业应用-文献精读51

Spatial multi-omics in medicinal plants: from biosynthesis pathways to industrial applications 药用植物的空间多组学&#xff1a;从生物合成途径到工业应用 摘要 随着分子测序和成像技术的快速发展&#xff0c;药用植物的多组学研究进入了单细胞时代。我们讨论了空间多…

振弦式渗压计常见故障有哪些?怎么解决?

振弦式渗压计是一种用于测量结构物或土体内部渗透水压力的仪器&#xff0c;广泛应用于土木工程、水利工程及环境监测领域。在使用过程中&#xff0c;可能会遇到一些常见的故障&#xff0c;以下是一些故障及其解决方法&#xff1a; 1. 读数不稳定&#xff1a; - 确保渗压计安装在…

React18入门教程

React介绍 React由Meta公司开发&#xff0c;是一个用于 构建Web和原生交互界面的库 React的优势 相较于传统基于DOM开发的优势 组件化的开发方式 不错的性能 相较于其它前端框架的优势 丰富的生态 跨平台支持 React的市场情况 全球最流行&#xff0c;大厂必备 开发环境…

2024年数学建模比赛题目及解题代码

目录 一、引言 1. 1竞赛背景介绍 1.1.1数学建模竞赛概述 1.1.2生产过程决策问题在竞赛中的重要性 1.2 解题前准备 1.2.2 工具与资源准备 1.2.3 心态调整与策略规划 二、问题理解与分析 三、模型构建与求解 3.1 模型选择与设计 3.1.1 根据问题特性选择合适的数学模型类…

线程池的执行流程和配置参数总结

一、线程池的执行流程总结 提交线程任务&#xff1b;如果线程池中存在空闲线程&#xff0c;则分配一个空闲线程给任务&#xff0c;执行线程任务&#xff1b;线程池中不存在空闲线程&#xff0c;则线程池会判断当前线程数是否超过核心线程数&#xff08;corePoolSize&#xff09…

【超详细】基于YOLOv8训练无人机视角Visdrone2019数据集

主要内容如下&#xff1a; 1、Visdrone2019数据集介绍 2、下载、制作YOLO格式训练集 3、模型训练及预测 4、Onnxruntime推理 运行环境&#xff1a;Python3.8&#xff08;要求>3.8&#xff09;&#xff0c;torch1.12.0cu113&#xff08;要求>1.8&#xff09;&#xff0c…

[Python]一、Python基础编程(2)

F:\BaiduNetdiskDownload\2023人工智能开发学习路线图\1、人工智能开发入门\1、零基础Python编程 1. 文件操作 把⼀些内容 ( 数据 )存储存放起来,可以让程序下⼀次执⾏的时候直接使⽤,⽽不必重新制作⼀份,省时省⼒ 。 1.1 文件的基本操作 1. 打开文件 2. 读写操作 3. 关闭…

【Go】Go语言切片(Slice)深度剖析与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

[PICO VR]Unity如何往PICO VR眼镜里写持久化数据txt/json文本

前言 最近在用PICO VR做用户实验&#xff0c;需要将用户实验的数据记录到PICO头盔的存储空间里&#xff0c;记录一下整个过程 流程 1.开启写入权限 首先开启写入权限&#xff1a;Unity->Edit->Player->安卓小机器人->Other Settings->Configuration->Wri…

Spring的任务调度

Spring的任务调度 1.概述 Spring框架为任务调度提供了专门的解决方案。在Spring框架的org.springframework.scheduling包中&#xff0c;通过对JDK 的ScheduledExecutorService接口的实例进行封装&#xff0c;对外提供了一些注解和接口&#xff0c;为开发者处理定时任务提供了…