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

Qt 模型视图(四):代理类QAbstractItemDelegate

文章目录

  • Qt 模型视图(四):代理类`QAbstractItemDelegate`
    • 1.基本概念
      • 1.1.使用现有代理
      • 1.2.一个简单的代理
    • 2.提供编辑器
    • 3.向模型提交数据
    • 4.更新编辑器的几何图形
    • 5.编辑提示

Qt 模型视图(四):代理类QAbstractItemDelegate

模型/视图结构是一种将数据存储界面展示分离的编程方法。模型存储数据,视图组件显示模型中的数据,在视图组件里修改的数据会被自动保存到模型里。模型的数据来源可以是内存中的字符串列表或二维表格型数据,也可以是数据库中的数据表,一种模型可以用不同的视图组件来显示数据,所以模型/视图结构是一种高效、灵活的编程结构。

1.基本概念

与模型-视图-控制器模式不同,模型/视图设计不包括一个完全独立的组件来管理与用户的交互。通常,视图负责向用户呈现模型数据,并处理用户输入。为了使获得此输入的方式具有一定的灵活性,交互由代表执行。这些组件提供输入功能,还负责在某些视图中呈现单个项目。控制委托的标准接口在QAbstractItemDelegate类中定义。
委托应该能够通过实现paint()和sizeInt()函数来呈现自己的内容。但是简单的基于小部件的委托可以子类化QStyleItemDelegate替代QAbstractItemDelegate,并利用这些函数的默认实现。
代理的编辑器可以通过使用小部件来管理编辑过程或直接处理事件来实现。稍后将介绍第一种方法。

1.1.使用现有代理

Qt提供的标准视图使用QStyleItemDelegate的实例来提供编辑功能。委托接口的此默认实现以每个标准视图的常用样式呈现项目:QListView、QTableView和QTreeView
所有标准角色都由标准视图使用的默认委托处理。QStyledItemDelegate文档中描述了这些内容的解释方式。
视图使用的委托由itemDelegate()函数返回。setItemDelegate()函数允许您为标准视图安装自定义委托,在为自定义视图设置委托时必须使用此函数。

1.2.一个简单的代理

这里实现的委托使用QSpinBox提供编辑功能,主要用于显示整数的模型。尽管我们为此目的设置了一个基于整数的自定义表模型,但我们本可以很容易地使用QStandardItemModel,因为自定义委托控制着数据输入。我们构造了一个表视图来显示模型的内容,这将使用自定义委托进行编辑。
在这里插入图片描述
我们将委托从QStyleItemDelegate子类化,因为我们不想编写自定义显示函数。但是,我们仍然必须提供管理编辑器小部件的功能:

 class SpinBoxDelegate : public QStyledItemDelegate{Q_OBJECTpublic:SpinBoxDelegate(QObject *parent = nullptr);QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,const QModelIndex &index) const override;void setEditorData(QWidget *editor, const QModelIndex &index) const override;void setModelData(QWidget *editor, QAbstractItemModel *model,const QModelIndex &index) const override;void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option,const QModelIndex &index) const override;};SpinBoxDelegate::SpinBoxDelegate(QObject *parent): QStyledItemDelegate(parent){}

请注意,在构造委托时不会设置编辑器小部件。我们只在需要时构建编辑器小部件。

2.提供编辑器

在这个例子中,当表视图需要提供编辑器时,它会要求委托提供一个适合被修改项目的编辑器小部件。createEditor()函数提供了委托设置合适小部件所需的一切:

  QWidget *SpinBoxDelegate::createEditor(QWidget *parent,const QStyleOptionViewItem &/* option */,const QModelIndex &/* index */) const{QSpinBox *editor = new QSpinBox(parent);editor->setFrame(false);editor->setMinimum(0);editor->setMaximum(100);return editor;}

请注意,我们不需要保留指向编辑器小部件的指针,因为视图负责在不再需要时销毁它。
我们在编辑器上安装代理的默认事件过滤器,以确保它提供用户期望的标准编辑快捷方式。可以在编辑器中添加其他快捷方式,以允许更复杂的行为;这些将在编辑提示一节中讨论。
该视图通过调用我们稍后为此目的定义的函数来确保编辑器的数据和几何图形设置正确。我们可以根据视图提供的模型索引创建不同的编辑器。例如,如果我们有一列整数和一列字符串,我们可以返回QSpinBox或QLineEdit,具体取决于正在编辑的列。
委托必须提供将模型数据复制到编辑器中的函数。在这个例子中,我们读取存储在显示角色中的数据,并相应地在旋转框中设置值。

 void SpinBoxDelegate::setEditorData(QWidget *editor,const QModelIndex &index) const{int value = index.model()->data(index, Qt::EditRole).toInt();QSpinBox *spinBox = static_cast<QSpinBox*>(editor);spinBox->setValue(value);}

在这个例子中,我们知道编辑器小部件是一个数字设定框。我们可以为模型中不同类型的数据提供不同的编辑器,在这种情况下,我们需要在访问其成员函数之前将小部件转换为适当的类型。

3.向模型提交数据

当用户在数字设定框中编辑完值后,视图会调用setModelData()函数要求委托将编辑后的值存储在模型中。

 void SpinBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,const QModelIndex &index) const{QSpinBox *spinBox = static_cast<QSpinBox*>(editor);spinBox->interpretText();int value = spinBox->value();model->setData(index, value, Qt::EditRole);}

由于视图管理代理的编辑器小部件,我们只需要用提供的编辑器的内容更新模型。在这种情况下,我们确保数字设定框是最新的,并使用指定的索引用它包含的值更新模型。
标准QStyledItemDelegate类通过发出closeEditor()信号通知视图何时完成编辑。该视图确保编辑器小部件已关闭并销毁。在这个例子中,我们只提供简单的编辑工具,所以我们永远不需要发出这个信号。
所有数据操作都是通过QAbstractItemModel提供的接口执行的。这使得委托在很大程度上独立于它所处理的数据类型,但为了使用某些类型的编辑器小部件,我们必须做出一些假设。在这个例子中,我们假设模型总是包含整数值,但我们仍然可以将此委托用于不同类型的模型,因为QVariant为意外数据提供了合理的默认值。

4.更新编辑器的几何图形

管理编辑器的几何图形是代理的责任。创建编辑器,更改项目在视图中的大小或位置时,必须设置几何图形。幸运的是,视图在视图选项对象中提供了所有必要的几何信息。

 void SpinBoxDelegate::updateEditorGeometry(QWidget *editor,const QStyleOptionViewItem &option,const QModelIndex &/* index */) const{editor->setGeometry(option.rect);}

在这各案例中,我们只使用条目矩形中的视图选项提供的几何信息。呈现具有多个元素的条目的委托不会直接使用条目矩形。它将使编辑器相对于项目中的其他元素进行定位。

5.编辑提示

编辑后,代理应向其他组件提供有关编辑过程结果的提示,并提供有助于任何后续编辑操作的提示。这是通过发出带有适当提示的closeEditor()信号来实现的。这是由构建spin box时安装的默认QStyledItemDelegate事件过滤器来处理的。
可以调整数字设定框的行为,使其更便于用户使用。在QStyledItemDelegate提供的默认事件过滤器中,如果用户点击Return确认他们在数字设定框中的选择,则代理将值提交给模型并关闭数字设定框。我们可以通过在数字设定框上安装自己的事件过滤器来改变这种行为,并提供适合我们需求的编辑提示;例如,我们可能会发出带有EditNextItem提示的closeEditor(),以自动开始编辑视图中的下一个项目。
另一种不需要使用事件过滤器的方法是提供我们自己的编辑器小部件,为了方便起见,可能会对QSpinBox进行子类化。这种替代方法将使我们能够以编写额外代码为代价,更好地控制编辑器小部件的行为。如果需要自定义标准Qt编辑器小部件的行为,通常在委托中安装事件过滤器会更容易。
委托不必发出这些提示,但那些没有发出提示的委托将较少地集成到应用程序中,并且将比那些发出提示以支持常见编辑操作的委托更难使用。

相关文章:

Qt 模型视图(四):代理类QAbstractItemDelegate

文章目录 Qt 模型视图(四):代理类QAbstractItemDelegate1.基本概念1.1.使用现有代理1.2.一个简单的代理 2.提供编辑器3.向模型提交数据4.更新编辑器的几何图形5.编辑提示 Qt 模型视图(四):代理类QAbstractItemDelegate ​ 模型/视图结构是一种将数据存储和界面展示分离的编程方…...

django+vue

1. diango 只能加载静态js&#xff0c;和flask一样 2. 关于如何利用vue创建web&#xff0c;请查看flask vue-CSDN博客 3. 安装django pip install django 4. 创建新项目 django-admin startproject myproject 5.django 中可以包含多个app 5.1 创建一个app cd myprojec…...

HCIA--实验十七:EASY IP的NAT实现

一、实验内容 1.需求/要求&#xff1a; 通过一台PC&#xff0c;一台交换机&#xff0c;两台路由器来成功实现内网访问外网。理解NAT的转换机制。 二、实验过程 1.拓扑图&#xff1a; 2.步骤&#xff1a; 1.PC1配置ip地址及网关&#xff1a; 2.AR1接口配置ip地址&#xff1…...

彻底解决:QSqlDatabase: QMYSQL driver not loaded

具体错误 QSqlDatabase: QMYSQL driver not loaded QSqlDatabase: available drivers: QSQLITE QMIMER QMARIADB QMYSQL QODBC QPSQL 检查驱动 根据不同安装目录而不同&#xff1a; D:\Qt\6.7.2\mingw_64\plugins\sqldrivers 编译驱动 如果没有&#xff0c;需要自行编译&…...

leetcode02——59. 螺旋矩阵 II、203. 移除链表元素

59. 螺旋矩阵 II class Solution {public int[][] generateMatrix(int n) {int[][] nums new int[n][n]; // 定义二维数组用于存储数据int startX 0; // 定义每循环一个圈的起始位置int startY 0;int loop 1; // 定义圈数&#xff0c;最少1圈int count 1; // 用来给矩阵中…...

Matlab Simulink 主时间步(major time step)、子时间步(minor time step)

高亮颜色说明&#xff1a;突出重点 个人觉得&#xff0c;&#xff1a;待核准个人观点是否有误 高亮颜色超链接 文章目录 对Simulink 时间步的理解Simulink 采样时间的类型Discrete Sample Times(离散采样时间)Controllable Sample Time(可控采样时间) Continuous Sample Times(…...

docker 升级步骤

Docker 升级的步骤通常取决于你所使用的操作系统。以下是针对常见操作系统&#xff08;如 Ubuntu 和 CentOS&#xff09;的 Docker 升级步骤&#xff1a; Ubuntu 更新现有的包索引&#xff1a; sudo apt-get update 升级 Docker&#xff1a; 您可以运行以下命令来升级 Docker…...

828华为云征文 | 云服务器Flexus X实例:one-api 部署,支持众多大模型

目录 一、one-api 介绍 二、部署 one-api 2.1 拉取镜像 2.2 部署 one-api 三、运行 one-api 3.1 添加规则 3.2 运行 one-api 四、添加大模型 API 4.1 添加大模型 API 五、总结 本文通过 Flexus云服务器X实例 部署 one-api。Flexus云服务器X实例是新一代面向中小企业…...

2024 SNERT 预备队招新 CTF 体验赛-Web

目录 1、robots 2、NOF12 3、get_post 4、好事慢磨 5、uploads 6、rce 7、ezsql 8、RCE 1、robots robots 协议又叫爬虫协议&#xff0c;访问 robots.txt 继续访问 /JAY.php 拿到 flag&#xff1a;flag{hello_Do_YOU_KONw_JAY!} 2、NOF12 F12 和右键都被禁用 方法&#…...

亲测全网10大“免费”论文降重神器!论文写作必备!

在当今学术研究和论文写作中&#xff0c;AI技术的应用已经变得越来越普遍。为了帮助学者们更高效地完成论文撰写任务&#xff0c;以下将详细介绍十款必备的论文写作工具&#xff0c;其中特别推荐千笔-AIPassPaper。 1. 千笔-AIPassPaper 千笔-AIPassPaper是一款基于深度学习和…...

二分算法——优选算法

个人主页&#xff1a;敲上瘾-CSDN博客 个人专栏&#xff1a;游戏、数据结构、c语言基础、c学习、算法 本章我们来学习的是二分查找算法&#xff0c;二分算法的应用非常广泛&#xff0c;不仅限于数组查找&#xff0c;还可以用于解决各种搜索问题、查找极值问题等。在数据结构和算…...

Kafka 的基本概念

一、Kafka 主要用来做什么 作为消息系统&#xff1a;Kafka 具备系统解藕&#xff0c;流量削峰&#xff0c;缓冲&#xff0c;异步通信&#xff0c;扩展性&#xff0c;可恢复性等功能&#xff0c;以及消息顺序性保障和回溯消费 作为存储系统&#xff1a;Kafka 把消息持久化到磁…...

《粮油与饲料科技》是什么级别的期刊?是正规期刊吗?能评职称吗?

问题解答 问&#xff1a;《粮油与饲料科技》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的第一批认定 学术期刊。 问&#xff1a;《粮油与饲料科技》级别&#xff1f; 答&#xff1a;省级。主管单位&#xff1a;中文天地出版传媒集团股份有限公司…...

Python之一些列表的练习题

1.比较和对比字符串、列表和元组。例如&#xff0c;它们可以容纳哪类内容以及在数据结构上可以做哪些操作。 1. 内容类型:- 字符串: 只能包含字符(文本)。- 列表: 可以包含任意类型的数据,如数字、字符串、其他列表等。- 元组: 可以包含任意类型的数据,与列表类似。3. 操作:(1…...

MoFA: 迈向AIOS

再一次向朋友们致以中秋的祝福&#xff01; MoFA (Modular Framework for Agents)是一个独特的模块化AI智能体框架。MoFA以组合&#xff08;Composition)的逻辑和编程&#xff08;Programmable&#xff09;的方法构建AI智能体。开发者通过模版的继承、编程、定制智能体&#xf…...

c语言中define使用方法

在C语言中&#xff0c;#define指令是预处理指令&#xff0c;用于定义宏。其常用格式是&#xff1a; 定义常量&#xff1a; #define 常量名 常量值 例子&#xff1a; #define PI 3.14159 #define MAX_SIZE 100 这里&#xff0c;PI和MAX_SIZE在代码中会被替换为其对应的值。没有…...

尚品汇-秒杀商品定时任务存入缓存、Redis发布订阅实现状态位(五十一)

目录&#xff1a; &#xff08;1&#xff09;秒杀业务分析 &#xff08;2&#xff09;搭建秒杀模块 &#xff08;3&#xff09;秒杀商品导入缓存 &#xff08;4&#xff09;redis发布与订阅实现 &#xff08;1&#xff09;秒杀业务分析 需求分析 所谓“秒杀”&#xff0…...

第十一章 【后端】商品分类管理微服务(11.4)——spring-boot-devtools

11.4 spring-boot-devtools 官网:https://docs.spring.io/spring-boot/reference/using/devtools.html Spring Boot DevTools 是 Spring Boot 提供的一组易于使用的工具,旨在加速开发和测试过程。它通过提供一系列实用的功能,如自动重启、实时属性更新、依赖项的热替换等,…...

MySQL篇(索引)(持续更新迭代)

目录 一、简介 二、有无索引情况 1. 无索引情况 2. 有索引情况 3. 优劣势 三、索引结构 1. 简介 2. 存储引擎对于索引结构的支持情况 3. 为什么InnoDB默认的索引结构是Btree而不是其它树 3.1. 二叉树&#xff08;BinaryTree&#xff09; 3.2. 红黑树&#xff08;RB&a…...

通用接口开放平台设计与实现——(31)API服务线程安全问题确认与修复

背景 在本系列的前面一篇博客评论中&#xff0c;有小伙伴指出&#xff0c;API服务存在线程安全问题&#xff1a; https://blog.csdn.net/seawaving/article/details/122905199#comments_34477405 今天来确认下&#xff0c;线程是否安全&#xff1f;如不安全&#xff0c;如何…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...

从物理机到云原生:全面解析计算虚拟化技术的演进与应用

前言&#xff1a;我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM&#xff08;Java Virtual Machine&#xff09;让"一次编写&#xff0c;到处运行"成为可能。这个软件层面的虚拟化让我着迷&#xff0c;但直到后来接触VMware和Doc…...

如何通过git命令查看项目连接的仓库地址?

要通过 Git 命令查看项目连接的仓库地址&#xff0c;您可以使用以下几种方法&#xff1a; 1. 查看所有远程仓库地址 使用 git remote -v 命令&#xff0c;它会显示项目中配置的所有远程仓库及其对应的 URL&#xff1a; git remote -v输出示例&#xff1a; origin https://…...