当前位置: 首页 > news >正文

QT基础篇(8)QT5模型视图结构

1.概述

QT5的模型视图结构主要包括模型(Model)、视图(View)和委托(Delegate)三个部分。

  1. 模型(Model):模型是数据的抽象表示,负责存储和管理数据。它可以是自定义的数据结构,也可以是继承自QAbstractItemModel类的模型类。模型类通过提供一组接口函数来提供数据的访问、修改、插入和删除等功能。

  2. 视图(View):视图用于显示模型中的数据,并与用户进行交互。常见的视图类有QTreeView、QListView和QTableView等。视图根据模型的数据结构和视图类的特点,将数据以树形、列表或表格的形式进行显示。

  3. 委托(Delegate):委托用于控制视图中的单元格的显示和编辑行为。可以通过自定义委托类继承自QAbstractItemDelegate类来实现。委托类提供了一组接口函数,用于自定义单元格的显示和编辑行为,如绘制、编辑、大小调整等。

模型-视图结构的工作原理如下:

  1. 模型:模型负责存储和管理数据,提供接口函数供视图访问和修改数据。当数据改变时,模型会发出相应的信号告知视图进行更新。

  2. 视图:视图根据模型的数据结构将数据以树形、列表或表格的形式进行显示。视图负责显示模型中的数据,并处理用户的交互操作。当用户对视图进行操作(如点击、编辑等),视图会将相应的操作通知给模型进行数据的修改。

  3. 委托:委托用于控制视图中的单元格的显示和编辑行为。视图在显示或编辑单元格时,会调用委托类的接口函数。委托类可以根据需要,自定义单元格的显示和编辑行为,如自定义绘制、编辑控件等。

通过模型-视图结构,可以将数据和界面进行有效地分离,使得数据和界面的变动互不干扰。同时,QT5提供了丰富的模型类、视图类和委托类,可以根据需要灵活地进行组合和定制,以满足不同的应用需求。

模型/视图类使用

在QT5中,可以使用预定义的模型和视图类,也可以自定义模型和视图类。下面分别介绍如何使用预定义的模型和视图类以及如何自定义模型和视图类。

使用预定义的模型和视图类:

  1. 创建模型对象:可以使用QStandardItemModel、QSqlTableModel、QSqlQueryModel等预定义的模型类创建模型对象。例如:
QStandardItemModel *model = new QStandardItemModel(parent);

  1. 填充模型数据:使用模型对象的函数来填充数据,比如setItem()、setRowCount()、setColumnCount()等。例如:
model->setItem(row, column, new QStandardItem("data"));

  1. 创建视图对象:可以使用QTreeView、QListView、QTableView等预定义的视图类创建视图对象。例如:
QTreeView *view = new QTreeView(parent);

  1. 设置模型:将模型对象设置给视图对象,使用setModel()函数。例如:
view->setModel(model);

  1. 显示视图:将视图对象添加到布局或窗口中,使其显示出来。例如:
layout->addWidget(view);

自定义模型和视图类:

  1. 创建自定义模型类:继承QAbstractItemModel类,实现其纯虚函数,根据数据的结构和特点,自定义模型类的数据存储和访问方式。例如:
class MyModel : public QAbstractItemModel {// ...
};

  1. 创建自定义视图类:继承QTreeView、QListView、QTableView等预定义的视图类,根据需要可以重写其函数,实现特定的显示和交互方式。例如:
class MyView : public QTreeView {// ...
};

  1. 创建模型对象和视图对象:根据自定义的模型类和视图类,创建对象。例如:
MyModel *model = new MyModel(parent);
MyView *view = new MyView(parent);

  1. 设置模型:将模型对象设置给视图对象,使用setModel()函数。例如:
view->setModel(model);

  1. 显示视图:将视图对象添加到布局或窗口中,使其显示出来。例如:
layout->addWidget(view);

以上是使用预定义的模型和视图类、自定义模型和视图类的一般步骤。根据具体需求,可以根据QT5的文档和示例代码,进一步了解和使用模型和视图类的功能和特性。

2.模型(Model)

模型(Model)是在MVC(Model-View-Controller)设计模式中的一部分,用于存储和管理数据。在QT5中,模型提供了一种用于组织和操作数据的方式,可以将数据与视图分离,使其更易于管理和显示。

在QT5中,有几种预定义的模型类可以使用:

  1. QAbstractItemModel:是所有模型类的基类,定义了一些纯虚函数,需要子类来实现,以提供自定义的数据存储和访问方式。

  2. QStandardItemModel:是一个使用QStandardItem对象作为数据项的模型类。每个数据项都包含一个文本和可选的图标等属性。

  3. QSqlTableModel:是一个与数据库表对应的模型类,可以用于直接访问数据库中的数据。

  4. QSqlQueryModel:是一个基于SQL查询的模型类,可以通过执行SQL查询来获取数据并显示。

自定义模型类的步骤如下:

  1. 继承QAbstractItemModel类,创建自定义模型类。

  2. 在自定义模型类中实现以下纯虚函数:

    • rowCount():返回模型的行数。
    • columnCount():返回模型的列数。
    • data():返回给定索引的数据。
    • index():返回具有给定行和列的索引。
    • parent():返回给定索引的父索引。
  3. 根据需要,可以实现其他函数来支持模型的编辑、插入、删除等操作。

使用模型的步骤如下:

  1. 创建模型对象,可以是预定义的模型类对象,也可以是自定义模型类的对象。

  2. 通过模型对象的函数来填充数据,比如setItem()、setData()等。

  3. 将模型对象设置给视图对象,使用setModel()函数。

  4. 显示视图对象,将其添加到布局或窗口中。

  5. 可以通过模型对象的函数来访问和操作数据,比如获取数据、修改数据等。

模型的使用可以实现数据的存储、排序、过滤和显示等功能,提高应用程序的灵活性和可扩展性。可以根据具体需求,选择合适的模型类或者自定义模型类来实现数据的管理和显示。

3.视图(View)

在QT中,有多种视图可以用于显示模型中的数据,包括但不限于以下几种:

  1. QTableView:QTableView是QT中最常用的视图之一,它以表格的形式展示数据。每个单元格都可以编辑,并且支持排序、过滤、选择等功能。

  2. QTreeView:QTreeView是以树状结构展示数据的视图。通过树状的父子关系,可以方便地展示层级关系的数据。

  3. QListView:QListView是以列表形式展示数据的视图。它提供了横向和纵向的滚动条,适用于较长的数据列表。

  4. QGraphicsView:QGraphicsView是用于显示基于图形场景(QGraphicsScene)的视图。它支持复杂的图形和图像的显示,可以进行缩放、旋转、拖拽等操作。

除了上述常用视图外,QT还提供了其他一些视图类,如QColumnView(用于显示列的视图)、QHeaderView(显示表格或列表的标题栏)等。

使用视图的步骤如下:

  1. 创建视图对象,如QTableView、QTreeView等。

  2. 将模型对象设置给视图对象,使用setModel()函数。

  3. 可以通过视图对象的函数来设置或获取视图的外观,如设置表头、背景色、选择模式等。

  4. 可以通过视图对象的信号和槽来实现与用户的交互,如点击、双击、选择等操作。

  5. 将视图对象添加到布局或窗口中,显示出来。

通过使用适合的视图来展示数据,可以提供良好的用户体验,并且可以根据需求进行定制和扩展。在QT中,视图和模型之间的关联是通过模型-视图架构(Model-View)来实现的,因此可以很方便地修改数据和显示方式,而不会影响彼此。

4.代理

在QT5的模型/视图结构中,代理(Delegate)是一种用于自定义视图的外观和行为的机制。代理可以用来修改某些或全部的视图单元格的显示、编辑和交互方式,从而实现更灵活的界面效果。

QT中提供了以下几种常用的代理类:

  1. QStyledItemDelegate:这是QT默认的代理类,提供了默认的外观和行为。可以通过继承QStyledItemDelegate来自定义代理。

  2. QItemDelegate:这是一个更通用的代理类,它提供了更多的功能和设置选项,如自定义绘制、编辑器的创建等。

  3. QAbstractItemDelegate:这是一个抽象类,需要继承并实现其虚函数才能创建自定义的代理。

使用代理的步骤如下:

  1. 创建代理对象,如QItemDelegate或自定义的代理类对象。

  2. 将代理对象设置给视图对象,使用setItemDelegate()函数。

  3. 可以通过代理对象的函数来设置或获取不同视图单元格的外观和行为,如设置对齐方式、背景色、编辑器等。

  4. 可以通过代理对象的虚函数来自定义视图单元格的绘制和编辑行为,如绘制复杂的图标、自定义编辑器的显示和验证等。

下面是一个使用代理的示例代码:

// 创建代理对象
QItemDelegate* delegate = new QItemDelegate(this);// 将代理对象设置给视图对象
tableView->setItemDelegate(delegate);// 自定义某个单元格的外观和行为
delegate->setAlignment(Qt::AlignCenter, Qt::DisplayRole);// 自定义某个单元格的编辑器
QSpinBox* spinBox = new QSpinBox(tableView);
delegate->setEditorData(spinBox, QModelIndex());

通过使用代理,我们可以对不同的视图单元格进行个性化的定制,使界面更加灵活和富有交互性。

相关文章:

QT基础篇(8)QT5模型视图结构

1.概述 QT5的模型视图结构主要包括模型(Model)、视图(View)和委托(Delegate)三个部分。 模型(Model):模型是数据的抽象表示,负责存储和管理数据。它可以是自…...

vue3-响应式基础之reactive

reactive() 还有另一种声明响应式状态的方式&#xff0c;即使用 reactive() API。与将内部值包装在特殊对象中的 ref 不同&#xff0c;reactive() 将使对象本身具有响应性&#xff1a; 「点击按钮1」 <script lang"ts" setup> import { reactive } from vuec…...

【ceph】如何将osd的内容挂载出来---ceph-objectstore-tool 实现

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…...

怎样实现安全便捷的网间数据安全交换?

数据安全交换是指在数据传输过程中采取一系列措施来保护数据的完整性、机密性和可用性。网间数据安全交换&#xff0c;则是需要进行跨网络、跨网段甚至跨组织地进行数据交互&#xff0c;对于数据的传输要求会更高。 大部分企业都是通过网闸、DMZ区、VLAN、双网云桌面等方式实现…...

微信小程序定义并获取日志/实时log信息

步骤一&#xff1a;开通实时日志 可以在开发者工具->详情->性能质量->实时日志&#xff0c;点击前往&#xff0c;在浏览器打开we分析界面&#xff1a; 也可登录小程序管理后台&#xff0c;点击统计进入we分析&#xff1a; 在we分析界面找到性能质量&#xff0c;打开实…...

海外代理IP怎么用?常见使用问题及解决方案

海外代理IP是指提供全球范围内的代理服务器&#xff0c;代理服务器充当IP与目标网站之间的中介&#xff0c;可以起到安全匿名、提高网速、突破网络壁垒的作用。在使用代理IP的过程中&#xff0c;用户可能会遇到各种挑战&#xff0c;如连接问题、速度慢等。理解这些问题的原因并…...

DP:数位DP

数位DP的大致思想&#xff1a;枚举每一位能选取的合法值。 1. LC 2376 统计特殊整数 说是DP&#xff0c;但实际上状态转移方程挺难写的&#xff0c;毕竟是枚举集合论&#xff0c;这里就不贴状态转移方程了。总体的写法其实是搜索记忆化。之所以称之为DP&#xff0c;是因为&am…...

js逆向第21例:猿人学第20题新年挑战

文章目录 一、前言二、定位加密参数1、定位wasm加密2、反编译wasm3、定位sign加密三、代码实现四、参考文献一、前言 新春福利:抓取这5页的数字,计算加和并提交结果 二、定位加密参数 通过get请求地址可以看到需要搞定参数有page、sign、t如下图: 进入堆栈不难发现这样一…...

贪心+蓝桥杯

原题路径 题目思路 : 思路很简单&#xff0c;肯定是贪心做法&#xff0c;要使总代价最小&#xff0c;需用那些出现次数比avg多的数来替换那些没有出现或者是出现次数少于avg的数, 所以我们存当前数每次出现的代价是多少 ,枚举每一个 0 - 9 之间的数 &#xff0c;如果当前数出现…...

第二篇:新建node项目并运行

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 安装 Node.js&#xff1a;首先&#xff0c;确保你的…...

阳光保险选择OceanBase稳定运行超700天

阳光保险集团成立于 2005 年 7 月&#xff0c;旗下拥有财产保险、人寿保险、信用保证保险、资产管理等多家专业子公司&#xff0c;是全球市场化企业中成长最快的集团公司之一&#xff0c;目前位列中国保险行业前八。随着数字化升级趋势的不断加速&#xff0c;很多企业产生将软硬…...

最强大脑闪电心算草稿1

#include<bits/stdc.h> #include<windows.h> using namespace std; int main() {double speed,n,op,sum0;int ans;srand(time(NULL));cout<<"请输入加(1)/减(2)/加减混合(3):";cin>>op;cout<<"请输入题目数量:";cin>>…...

融优学堂-艺术史

导论4 1.【单选题】根据导论的讲解&#xff0c;下列表述正确的是&#xff08;&#xff09;。&#xff08;1&#xff09;艺术品是因人的活动而被创造出来的人工制品。&#xff08;2&#xff09;许多物品被制造出来时&#xff0c;最初的目的是满足某种实用的用途&#xff0c;而不…...

༺༽༾ཊ—设计-七个-07-原则-模式—ཏ༿༼༻

第七原则&#xff1a;迪米特职责 类与类之间的耦合度尽可能低 换言之&#xff0c;我们可以理解成———只与直接朋友说话&#xff0c;不跟陌生人说话 直接朋友&#xff1a; 通过方法传参传进来的朋友&#xff0c; 类自己的字段&#xff0c; 构造函数进来的也是直接朋友&…...

一篇文章带你搞懂---全排序

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 全排序&#xff08;Permutation&#xff09;是指将一组元素按照一定的顺序进行排列的过程。在计算机科学中&#xff0c;全排序是一…...

提升问题检索的能力

事实上&#xff0c;在信息极度丰富的时代&#xff0c;信息检索和筛选能力格外重要。一些搜索引擎的出现已极大地方便了我们日常的信息检索&#xff0c;此处需要注意的是我们不能仅仅局限于常见的搜索引擎&#xff0c;也需要关注和积累一些专业平台或是具有集成功能的引擎&#…...

软件测试|SQLAlchemy query() 方法查询数据

简介 上一篇文章我们介绍了SQLAlchemy 的安装和基础使用&#xff0c;本文我们来详细介绍一下如何使用SQLAlchemy的query()方法来高效的查询我们的数据。 创建模型 我们可以先创建一个可供我们查询的模型&#xff0c;也可以复用上一篇文章中我们创建的模型&#xff0c;代码如…...

FlinkCDC的分析和应用代码

前言&#xff1a;原本想讲如何基于Flink实现定制化计算引擎的开发&#xff0c;并以FlinkCDC为例介绍&#xff1b;发现这两个在表达上不知以谁为主&#xff0c;所以先分析FlinkCDC的应用场景和技术实现原理&#xff0c;下一篇再去分析Flink能在哪些方面&#xff0c;做定制化计算…...

序章 搭建环境篇—准备战士的剑和盾

第一步&#xff1a;安装node.js Node.js 内置了npm&#xff0c;只要安装了node.js&#xff0c;就可以直接使用 npm&#xff0c;官网地址&#xff1a; Download | Node.js 在这里不建议安装最新版本的node.js&#xff0c;可以选跟我一样的版本&#xff0c;node版本v16.13.2 链…...

【C++】vector的使用及模拟实现

目录 一、vector的介绍及使用1.1 介绍vector1.2 vector的使用1.2.1 构造1.2.2 遍历访问1.2.3 容量空间1.2.4 增删查改 二、vector的模拟实现2.1 成员变量2.2 迭代器相关函数2.3 构造-析构-赋值重载2.3.1 无参构造2.3.2 有参构造12.3.3 有参构造22.3.4 拷贝构造2.3.5 赋值重载2.…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

go 里面的指针

指针 在 Go 中&#xff0c;指针&#xff08;pointer&#xff09;是一个变量的内存地址&#xff0c;就像 C 语言那样&#xff1a; a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10&#xff0c;通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态

前言 在人工智能技术飞速发展的今天&#xff0c;深度学习与大模型技术已成为推动行业变革的核心驱动力&#xff0c;而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心&#xff0c;系统性地呈现了两部深度技术著作的精华&#xff1a;…...