当前位置: 首页 > 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.…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解&#xff0c;涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容&#xff0c;并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念&#xff08;ACID&#xff09; 事务是…...

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如&#xff0c;已知表达式3*52&#xff0c;依照子表达式的求值顺序&#xff0c;有两种可能的结果&#xff0c;如图9-3所示。 如果乘法先执行&#xff0c;结果是17。如果5…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...

SpringAI实战:ChatModel智能对话全解

一、引言&#xff1a;Spring AI 与 Chat Model 的核心价值 &#x1f680; 在 Java 生态中集成大模型能力&#xff0c;Spring AI 提供了高效的解决方案 &#x1f916;。其中 Chat Model 作为核心交互组件&#xff0c;通过标准化接口简化了与大语言模型&#xff08;LLM&#xff0…...