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

机器翻译中的自校正方法:利用模型动态知识应对语义错位噪声

1. 项目概述&#xff1a;在嘈杂世界中学习翻译做机器翻译这行久了&#xff0c;最头疼的往往不是模型架构不够新&#xff0c;而是数据“不够干净”。我们每天打交道的数据&#xff0c;尤其是从互联网上爬取的海量平行语料库&#xff0c;比如大家熟知的ParaCrawl、CCAligned&…...

SSH连接报kex_exchange_identification的4步根因定位法

1. 这个报错不是SSH客户端的问题&#xff0c;而是服务器在“拒之门外” “kex_exchange_identification”——这串字符第一次出现在终端里时&#xff0c;我正帮一位刚转行做运维的同事排查一台新部署的Ubuntu云服务器。他反复执行 ssh userip &#xff0c;每次都在输入密码前…...

翻译工具:AI跨语言执行任务

翻译工具&#xff1a;AI跨语言执行任务&#x1f4dd; 本章学习目标&#xff1a;本章聚焦工具系统&#xff0c;让AI Agent具备丰富的执行能力。通过本章学习&#xff0c;你将全面掌握"翻译工具&#xff1a;AI跨语言执行任务"这一核心主题。一、引言&#xff1a;为什么…...

保险智能体部署失败率高达73%?揭秘头部险企AI Agent上线前必须完成的3个合规校验步骤

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;保险智能体部署失败率高达73%&#xff1f;揭秘头部险企AI Agent上线前必须完成的3个合规校验步骤 近期多家头部保险机构联合发布的《2024保险AI落地白皮书》指出&#xff0c;AI Agent在核心承保、核保与理赔场…...

Unity ShaderGraph设计思维:从示例资源读懂URP渲染管线

1. 这不是“示例资源包”&#xff0c;而是一套可复用的ShaderGraph设计思维训练集很多人点开Unity官方ShaderGraph示例资源&#xff08;Samples for Shader Graph&#xff09;时&#xff0c;第一反应是&#xff1a;“哦&#xff0c;又是一堆预设效果——水、玻璃、溶解、描边……...

从纸质报表到Excel:PaddleOCR+Python自动化识别复杂表格(附完整代码)

金融表格自动化革命&#xff1a;用PaddleOCRPython实现纸质报表秒转Excel每次月末结算时&#xff0c;财务部的张经理总要面对堆积如山的纸质报表——供应商对账单、银行流水单、税务申报表&#xff0c;这些表格往往带有手写注释、合并单元格和模糊印章。传统的人工录入不仅耗时…...

自动化业务通报系统实现

问题解构&#xff1a;需求核心是构建一个基于Python的自动化业务通报系统&#xff0c;用于从多个.xls报表中提取数据&#xff0c;按团队统计指标完成情况&#xff0c;生成手机适配的通报图片&#xff0c;并通过Web界面展示。系统需支持灵活的配置管理&#xff0c;包括团队信息、…...

AI 安全生产管理平台:用数字技术筑牢企业安全防线

传统企业安全生产长期依赖“人工巡检、事后整改”的模式&#xff0c;人工排查存在疲劳漏检、响应滞后、标准不一等痛点&#xff0c;很难全天候守住生产安全底线。而 AI 安全生产管理平台依托人工智能、物联网、边缘计算、大数据等核心技术&#xff0c;彻底打破传统“人防”局限…...

【收藏 2026 版】程序员零基础转 AI 应用赛道!不用深耕算法训练,靠现有编程功底轻松转行

当下 AI 技术全面普及&#xff0c;传统开发岗位竞争日趋激烈&#xff0c;不少程序员都想顺势切入人工智能领域。很多人觉得入行 AI 就得钻研复杂算法、上手大模型训练&#xff0c;门槛高到难以触碰。实则 2026 年 AI 应用开发门槛大幅降低&#xff0c;拥有基础编程能力&#xf…...

从录制到规划:手把手教你用CARLA录制点云,在Autoware中构建完整自动驾驶仿真闭环

从CARLA到Autoware&#xff1a;构建自定义自动驾驶仿真场景的完整实践指南 在自动驾驶技术快速迭代的今天&#xff0c;仿真测试已成为算法验证不可或缺的环节。CARLA与Autoware作为开源仿真平台和自动驾驶框架的黄金组合&#xff0c;为研究者提供了高度灵活的测试环境。本文将深…...