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

Realistic Vision V5.1 Streamlit界面源码解析:如何扩展自定义摄影滤镜

Realistic Vision V5.1 Streamlit界面源码解析&#xff1a;如何扩展自定义摄影滤镜 1. 项目背景与技术特点 Realistic Vision V5.1是目前SD 1.5生态中最顶级的写实风格模型之一&#xff0c;能够生成媲美专业单反相机拍摄的人像作品。本项目通过Streamlit框架构建了直观的交互…...

CameraLink三种模式(Base/Medium/Full)信号传输差异对比与选型建议

CameraLink三种工作模式深度解析与工业选型实战指南 在工业视觉检测线上&#xff0c;一台高速运行的贴片机正以每分钟800次的速度捕捉元件位置。当工程师将相机从200万像素升级到800万像素时&#xff0c;原本稳定的图像突然出现随机噪点——这往往是CameraLink模式选择不当导致…...

OpenHarmony驱动开发实战:手把手教你点亮一块MIPI DSI屏幕(Hi3516DV300平台)

OpenHarmony驱动开发实战&#xff1a;Hi3516DV300平台MIPI DSI屏幕点亮全流程解析 当一块全新的MIPI DSI屏幕交到嵌入式开发者手中时&#xff0c;从电路连接到最终点亮显示&#xff0c;中间需要跨越硬件接口适配、驱动参数配置、时序调试等多重技术关卡。本文将基于Hi3516DV300…...

LeaguePrank终极指南:免费打造个性化英雄联盟界面体验

LeaguePrank终极指南&#xff1a;免费打造个性化英雄联盟界面体验 【免费下载链接】LeaguePrank 项目地址: https://gitcode.com/gh_mirrors/le/LeaguePrank 还在为英雄联盟千篇一律的客户端界面感到乏味吗&#xff1f;LeaguePrank这款免费开源工具让你轻松自定义游戏中…...

无人水下航行器(UUV)与无人航空系统(UAS)时空会合关键技术研究附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码及仿真咨询…...

零代码!用Qwen-Image-2512-ComfyUI轻松制作中文电商配图与营销素材

零代码&#xff01;用Qwen-Image-2512-ComfyUI轻松制作中文电商配图与营销素材 1. 为什么选择Qwen-Image-2512-ComfyUI 电商运营和内容创作者经常面临一个共同难题&#xff1a;如何快速制作高质量的中文营销素材。传统设计工具需要专业技能&#xff0c;而普通AI绘画工具又难以…...

YOLOv8与YOLOv11网络结构对比:从yolov8.yaml到yolo11.yaml的演进与优化

YOLOv8与YOLOv11网络结构深度对比&#xff1a;从架构设计到性能优化 在计算机视觉领域&#xff0c;目标检测技术一直是研究热点&#xff0c;而YOLO(You Only Look Once)系列作为其中的佼佼者&#xff0c;以其高效的实时检测能力广受关注。本文将深入剖析YOLOv8与YOLOv11的网络结…...

GEE引擎封挂实战:从M2参数到RunGate网关的完整配置指南

GEE引擎封挂实战&#xff1a;从M2参数到RunGate网关的完整配置指南 在游戏运营过程中&#xff0c;外挂问题一直是困扰开发者和运营者的顽疾。对于使用GEE引擎的游戏服务器来说&#xff0c;如何有效防范和打击外挂行为&#xff0c;维护游戏公平性&#xff0c;是每个技术团队必须…...

Ostrakon-VL-8B在VMware虚拟机中的一站式部署与性能调优

Ostrakon-VL-8B在VMware虚拟机中的一站式部署与性能调优 想在本地隔离环境里跑通一个强大的多模态大模型&#xff0c;比如Ostrakon-VL-8B&#xff0c;但又不想折腾物理机或者担心影响主系统&#xff1f;VMware虚拟机是个不错的选择。不过&#xff0c;在虚拟机里部署AI应用&…...

RAGFlow源码部署避坑大全:从Poetry安装失败到NLTK资源缺失的完整修复指南

RAGFlow源码部署全攻略&#xff1a;从环境搭建到疑难解析的终极指南 1. 环境准备与系统要求 在开始RAGFlow的部署之前&#xff0c;确保您的系统满足以下最低配置要求&#xff1a;硬件配置&#xff1a; CPU&#xff1a;4核及以上内存&#xff1a;16GB及以上存储&#xff1a;50GB…...