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

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

在这里插入图片描述

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

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

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

相关文章

Unity3D入门(一) : 第一个Unity3D项目,实现矩形自动旋转,并导出到Android运行

1. Unity3D介绍 Unity3D是虚拟现实行业中&#xff0c;使用率较高的一款软件。 它有着强大的功能&#xff0c;是让玩家轻松创建三维视频游戏、建筑可视化、实时三维动画等互动内容的多平台、综合型 虚拟现实开发工具。是一个全面整合的专业引擎。 2. Unity安装 官网 : Unity…

感知笔记4:YOLO 3D 物体定位

如何在 ROS 中使用 YOLO 如何在 2D 中检测人和大象如何在 3D 中检测人和大象 有许多可用的深度学习库。您可能听说过&#xff1a;Keras、TensorFlow 和 Darknet。 在这里我们将使用 Darknet&#xff0c;因为它实现了 YOLOv3&#xff0c;这是一个对象检测模型。它非常快&…

【AI大语言模型】提示词工程基础及进阶

【AI大语言模型】提示词工程基础及进阶 什么是提示词&#xff08;Prompt&#xff09; 提示词&#xff08;Prompt&#xff09;是与人工智能对话时用来引导或触发生成某种输出的指令。 它相当于你在与 AI 进行互动时所提出的问题或任务说明。提示词可以是简短的指令、一个问题…

YOLOv8改进,YOLOv8替换主干网络为VanillaNet( CVPR 2023 华为提出的全新轻量化架构),大幅度涨点

改进前训练结果: 改进后训练结果: 摘要 基础模型的核心理念是“更多即不同”,这一理念在计算机视觉和自然语言处理领域取得了惊人的成功。然而,变压器模型的优化挑战和固有复杂性呼唤一种向简化转变的范式。在本研究中,引入了VanillaNet,一种拥抱设计优雅的神经网络架构…

VSCode好用的插件推荐

1. Chinese 将vscode翻译成简体中文 如果安装了依然是英文&#xff0c;请参考如下方法&#xff1a; ctrlshfitp 2. ESLint 自动检查规范 3. Prettier - Code formatter 可以自动调整代码的缩进、换行和空格&#xff0c;确保代码风格统一。通过配置&#xff0c;Prettier可…

掌握Android开发新趋势:Jetpack与现代架构技术全解析

随着Android开发技术的不断进步&#xff0c;Jetpack和现代架构技术已成为构建高效、可维护应用的关键。本文将为您介绍一套全面的学习资料&#xff0c;包括大纲、PDF文档、源代码以及学习视频&#xff0c;帮助您深入理解Jetpack核心库、架构组件以及现代开发工具。 内容&#…

python贪吃蛇游戏项目源码【免费】

使用Pygame库实现的贪吃蛇游戏。Pygame是一个用于创建视频游戏的Python模块集合&#xff0c;它提供了图形和声音库&#xff0c;使游戏开发变得容易。 初始化设置 屏幕大小 (SCREEN_WIDTH, SCREEN_HEIGHT): 定义了游戏窗口的宽度和高度。方格大小 (SIZE): 定义了游戏中每个小方…

简单水印通过python去除

简单水印通过python去除 先看效果&#xff0c;如果效果不是你需要的就可以不用浪费时间。 注意&#xff1a;这种主要还是对应的文字在水印上方的情况&#xff0c;同时最好不要有渐变水印否则可能最后输出的图片的水印还会有所残留&#xff0c;不过还是学习使用&#xff0c;相信…

救生圈检测系统源码分享

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

基于协同过滤算法的商品推荐系统

系统展示 用户前台界面 管理员后台界面 商家后台界面 系统背景 随着互联网技术的飞速发展&#xff0c;用户每天面临的信息量呈爆炸式增长&#xff0c;如何有效地筛选出用户感兴趣的内容成为一大挑战。在此背景下&#xff0c;基于协同过滤算法的商品推荐系统应运而生。该系统通过…

九章云极DataCanvas公司荣获2024年服贸会“科技创新服务示范案例”

9月15日&#xff0c;2024年中国国际服务贸易交易会&#xff08;服贸会&#xff09;示范案例交流会暨颁奖典礼在北京国家会议中心举行&#xff0c;九章云极DataCanvas 公司自研的DataCanvas Alaya NeW智算操作系统凭借卓越的AI创新实力、前瞻性的市场布局以及突破性的技术革新成…

Golang | Leetcode Golang题解之第423题从英文中重建数字

题目&#xff1a; 题解&#xff1a; func originalDigits(s string) string {c : map[rune]int{}for _, ch : range s {c[ch]}cnt : [10]int{}cnt[0] c[z]cnt[2] c[w]cnt[4] c[u]cnt[6] c[x]cnt[8] c[g]cnt[3] c[h] - cnt[8]cnt[5] c[f] - cnt[4]cnt[7] c[s] - cnt[6]…

机器翻译之Bahdanau注意力机制在Seq2Seq中的应用

目录 1.创建 添加了Bahdanau的decoder 2. 训练 3.定义评估函数BLEU 4.预测 5.知识点个人理解 1.创建 添加了Bahdanau的decoder import torch from torch import nn import dltools#定义注意力解码器基类 class AttentionDecoder(dltools.Decoder): #继承dltools.Decoder写…

LabVIEW提高开发效率技巧----使用事件结构优化用户界面响应

事件结构&#xff08;Event Structure&#xff09; 是 LabVIEW 中用于处理用户界面事件的强大工具。通过事件驱动的编程方式&#xff0c;程序可以在用户操作时动态执行特定代码&#xff0c;而不是通过轮询&#xff08;Polling&#xff09;的方式不断检查界面控件状态。这种方式…

【学习笔记】 使用AD24完成相同电路的自动布线布局(相同模块布局布线ROOM布线快速克隆)

【学习笔记】 使用AD24完成相同电路的自动布线布局 一、适用基本条件二、基于ROOM的自动布局/布线的方法三、可能出现的报错四、ROOM自动布局的一些优点和缺点 当面对多个相同电路模块时&#xff0c;使用 ROOM 可以一次性对一个模块进行精心布局&#xff0c;然后将该布局快速复…

粒子向上持续瀑布动画效果(直接粘贴到记事本改html即可)

代码&#xff1a; 根据个人喜好修改即可 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>宽粒子向上…

正则表达式匹配整数与浮点数失败与解决方案

正则表达式匹配整数与浮点数失败与解决方案 问题描述问题分析解决方案总结 问题描述 在处理数据的时候需要提取文本内整数与浮点数&#xff0c;这个时候想到使用正则表达式&#xff0c;咨询百度文心一言给出以下方案及参考代码 import re text "我有100元&#xff0c;…

解决mac下 Android Studio gradle 下载很慢,如何手动配置

抓住人生中的一分一秒&#xff0c;胜过虚度中的一月一年! 小做个动图开篇引题 前言 平时我们clone git 上项目&#xff0c;项目对应gradle版本本地没有&#xff0c;ide编译会自动下载&#xff0c;但是超级慢可能还下载失败&#xff0c;下面讲解下此问题如 如下图所示&#xff…

ML 系列:机器学习和深度学习的深层次总结(04)多元线性回归 (MLR)

图 1.多元线性回归与简单线性回归 一、说明 线性回归从一维推广到多维&#xff0c;这与单变量线性回归有很多不同&#xff0c;情况更加复杂&#xff0c;而在梯度优化也需要改成向量梯度&#xff0c;同时&#xff0c;数据预处理也成了必要步骤。 二、综述 多元线性回归是简单线性…

【AI算法岗面试八股面经【超全整理】——深度学习】

AI算法岗面试八股面经【超全整理】 概率论【AI算法岗面试八股面经【超全整理】——概率论】信息论【AI算法岗面试八股面经【超全整理】——信息论】机器学习【AI算法岗面试八股面经【超全整理】——机器学习】深度学习【AI算法岗面试八股面经【超全整理】——深度学习】CVNLP …