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

news2025/1/6 18:45:09

文章目录

  • 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());

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

在这里插入图片描述

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

高级I/O知识分享【5种IO模型 || select || poll】

博客主页&#xff1a;花果山~程序猿-CSDN博客 文章分栏&#xff1a;Linux_花果山~程序猿的博客-CSDN博客 关注我一起学习&#xff0c;一起进步&#xff0c;一起探索编程的无限可能吧&#xff01;让我们一起努力&#xff0c;一起成长&#xff01; 目录 一&#xff0c;前文 2&a…

无人机助力智慧农田除草新模式,基于YOLOv10全系列【n/s/m/b/l/x】参数模型开发构建无人机航拍场景下的农田杂草检测识别系统

科技发展到今天&#xff0c;无人机喷洒药物已经不是一件新鲜事情了&#xff0c;在很多高危的工作领域中&#xff0c;比如高空电力设备除冰&#xff0c;电力设备部件传送更换等等&#xff0c;无人机都可以扮演非常出色的作用&#xff0c;前面回到老家一段时间&#xff0c;最近正…

算法题总结(一)——二分查找专题

二分查找 我们二分查找的本质就是每次能够通过中间值来进行分割&#xff0c;能够比较判断&#xff0c;查找到或者接近需要的数据&#xff0c;然后把一部分的数据丢弃掉。 原题 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &…

LabVIEW提高开发效率技巧----使用快捷键

在LabVIEW的开发过程中&#xff0c;熟练掌握和运用快捷键可以极大地提升工作效率&#xff0c;减少重复性操作所花费的时间。快捷键不仅可以加快编程速度&#xff0c;还能让开发者更加专注于逻辑实现和功能设计。细问问将详细介绍LabVIEW中的常用快捷键&#xff0c;特别是强大的…

101012分页属性

4k页面 P&#xff08;有效位&#xff09;&#xff1a;1有效&#xff0c;0无效 R/W&#xff08;读写位&#xff09;&#xff1a;1可读可写&#xff0c;0可读 U/S&#xff08;权限位&#xff09;&#xff1a;1(User)&#xff0c;0(System) A&#xff08;物理页访问位&#xff…

医学数据分析实训 项目五 聚类分析--蛋白质消费结构分析--车辆驾驶行为指标

文章目录 项目五&#xff1a;聚类分析实践目的实践平台实践内容任务一&#xff1a;蛋白质消费结构分析步骤 任务一&#xff1a;蛋白质消费结构分析数据预处理&#xff08;四&#xff09;模型建立及优化KMeans 任务二 车辆驾驶行为&#xff08;四&#xff09;模型建立及优化 项目…

并发带来的对象一致性问题

多线程操作带来数据不一致情况分析&#xff0c;简单demo。 public class Object_IS {private Student_Object so new Student_Object("张三", 123);public static void main(String[] args) throws InterruptedException {Object_IS os new Object_IS();os.test1(…

论文笔记:交替单模态适应的多模态表征学习

整理了CVPR2024 Multimodal Representation Learning by Alternating Unimodal Adaptation&#xff09;论文的阅读笔记 背景MLA框架实验Q1 与之前的方法相比&#xff0c;MLA能否克服模态懒惰并提高多模态学习性能?Q2 MLA在面临模式缺失的挑战时表现如何?Q3 所有模块是否可以有…

输电线路缺陷检测数据集(绝缘子自爆,破损,闪络,鸟巢,防震锤脱落五种缺陷)

输电线路数据集&#xff08;绝缘子自爆&#xff0c;破损&#xff0c;闪络&#xff0c;鸟巢&#xff0c;防震锤脱落五种缺陷&#xff09;包括&#xff1a; 1.绝缘子自爆 2.绝缘子破损绝、闪络 3.鸟巢 4.防震锤脱落 数据增强后的数量 对应数量&#xff1a;1828&#xff0c;1467&a…

类加载器详细介绍

类加载器我们要聊一个神秘而又重要的角色——Java类加载器。这家伙&#xff0c;就像是个超级英雄&#xff0c;总是在关键时刻挺身而出&#xff0c;为我们的Java程序提供强大的支持。我会尽量用简单易懂的方式来介绍它。 一 、类加载器介绍 1、类加载器是什么&#xff1f; 想象…

高频率快响应信号隔离变送器

隔离变送器相册: 隔离变送器图片----捷晟达科技​​​​ 隔离变送器---深圳捷晟达科技 隔离变送器---捷晟达科技 高频率快响应信号隔离变送器 定义&#xff1a; 高频率是指隔离变送器从输入到输出采样时的时间&#xff0c;该产品响应频率从10KHz~100KHz&#xff0c;产品精度高&…

【CSS】选择器(基础选择器、复合选择器、属性匹配选择器、结构伪类选择器、伪元素选择器)

选择器 引入方式基础选择器复合选择器属性匹配选择器结构伪类选择器伪元素选择器 引入方式 1&#xff1a;外联 <!-- css引入方式1&#xff1a;外联 外联与内嵌优先级相同&#xff0c;取决于加载顺序 --><link rel"stylesheet" type"text/css" h…

箭头检测系统源码分享

箭头检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

子查询优化

MySQL学习大纲 我的数据库学习大纲 1、什么是子查询&#xff1a; 1.MySQL 从 4.1 版本开始支持子查询&#xff0c;使用子查询可以进行 SELECT 语句的嵌套查询&#xff0c;即一个 SELECT 查询的结果作为另一个 SELECT 语句的条件。子查询可以一次性完成很多逻辑上需要多个步骤才…

二分+构造,CF 1063C - Dwarves, Hats and Extrasensory Abilities

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1063C - Dwarves, Hats and Extrasensory Abilities 二、解题报告 1、思路…

AtCoder ABC370 A-D题解

比赛链接:ABC370 AT 上 400 分寄。 Problem A: Code #include <bits/stdc.h> using namespace std; int main(){int L,R;cin>>L>>R;if(LR)cout<<"Invalid"<<endl;else if(L1)cout<<"YES"<<endl;elsecout<…

【数据结构】经典题

所以&#xff0c;语句 x; 的语句频度为&#xff1a;n(n1)(n2&#xff09;/6 选C 临时变量 t&#xff1a;只使用了一个额外的变量来存储交换的值。 没有使用额外的数组&#xff1a;所有的操作都是在原数组 a 上进行的。 因此&#xff0c;算法的空间复杂度是常数级别的&#xff0…

定位HardFault

一、HardFault定义 STM32出现HardFault_Handler硬件错误的原因主要有两个方面&#xff1a; 1、内存溢出或者访问越界。&#xff08;包括使用野指针&#xff09; 2、堆栈溢出。 二、定位HardFault步骤 1. 判断所使用堆栈&#xff1a; 发生异常之后可首先查看LR寄存器中的值…

十五,Spring Boot 整合连接数据库(详细配置)

十五&#xff0c;Spring Boot 整合连接数据库(详细配置) 文章目录 十五&#xff0c;Spring Boot 整合连接数据库(详细配置)最后&#xff1a; JDBC HikariDataSource(Spring Boot内置的数据库) HikariDataSource: 目前市面上非常优秀的数据源&#xff0c;是 Spring Boot2默认数…

gcc/g++的使用:

目录 (1). 程序的翻译过程 预处理&#xff1a; gcc -E 源文件 编译&#xff1a; gcc -S 源文件 汇编&#xff1a;gcc -c 源文件 连接&#xff1a; (2) 语言的自举(也叫 编译器的自举)&#xff1a; (3). 查看可执行程序在连接时依赖的库: ldd 可执行程序的名字 。 (4). …