Qt中的Model与View5: QStyledItemDelegate

目录

QStyledItemDelegate API

重载公共函数

保护函数

重载保护函数


当在 Qt 项目视图中显示模型数据时,例如 QTableView,每个项目由代理绘制。此外,当项目被编辑时,提供一个编辑器小部件,该小部件在编辑时显示在项目视图上。QStyledItemDelegate 是所有 Qt 项目视图的默认代理,并在创建时自动安装。

QStyledItemDelegate 类是模型/视图框架的一部分,允许独立于模型和视图开发项目的显示和编辑。项目数据被分配给 ItemDataRole;每个项目可以为每个角色存储一个 QVariantQStyledItemDelegate 实现了对用户期望的最常见数据类型的显示和编辑,包括布尔值、整数和字符串。

数据将根据其在模型中的角色以不同的方式绘制。下表描述了角色及其可处理的数据类型。

角色可接受类型
Qt::BackgroundRoleQBrush
Qt::CheckStateRoleQt::CheckState
Qt::DecorationRoleQIcon, QPixmap, QImageQColor
Qt::DisplayRoleQString 和具有字符串表示的类型
Qt::EditRole参见 QItemEditorFactory 的详细信息
Qt::FontRoleQFont
Qt::SizeHintRoleQSize
Qt::TextAlignmentRoleQt::Alignment
Qt::ForegroundRoleQBrush

编辑器通过 QItemEditorFactory 创建;QItemEditorFactory 提供一个默认的静态实例,安装在所有项目代理上。你可以使用 setItemEditorFactory() 设置自定义工厂,或者通过 QItemEditorFactory::setDefaultFactory() 设置新的默认工厂。

如果代理不支持你所需的数据类型的绘制,或者你想自定义项目的绘制,需要继承 QStyledItemDelegate,并重新实现 paint() 和可能的 sizeHint()paint() 函数对每个项目单独调用,使用 sizeHint() 可以为每个项目指定提示。绘制复选框指示符的工作由当前样式执行。样式还指定了绘制不同数据角色的数据的大小和边界矩形。当绘制已支持的数据类型时,向样式请求这些边界矩形通常是个好主意。

如果你希望更改样式计算的边界矩形或复选框指示符的绘制,可以继承 QStyle

QStyledItemDelegate API

API 签名说明
QStyledItemDelegate(QObject *parent = nullptr)构造函数,创建一个 QStyledItemDelegate 对象,父对象为可选。
virtual ~QStyledItemDelegate()虚析构函数,释放 QStyledItemDelegate 对象。
virtual QString displayText(const QVariant &value, const QLocale &locale) const返回根据提供的值和区域设置格式化的文本,用于显示在视图中。
QItemEditorFactory *itemEditorFactory() const返回当前使用的编辑器工厂。
void setItemEditorFactory(QItemEditorFactory *factory)设置自定义的编辑器工厂。
重载公共函数
API 签名说明
virtual QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override创建用于编辑数据的自定义编辑器。
virtual void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override绘制视图中每个项目的外观。
virtual void setEditorData(QWidget *editor, const QModelIndex &index) const override为编辑器设置数据。
virtual void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override从编辑器获取数据并更新模型。
virtual QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override返回项目的建议大小。
virtual void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override更新编辑器的几何形状,使其正确显示。
保护函数
API 签名说明
virtual void initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const初始化样式选项,用于绘制项目。
重载保护函数
API 签名说明
virtual bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) override处理编辑器事件。
virtual bool eventFilter(QObject *editor, QEvent *event) override过滤编辑器的事件。

举个例子:

class TSpinBoxDelegate : public QStyledItemDelegate
{Q_OBJECT
​
public:explicit TSpinBoxDelegate(QObject *parent = nullptr);
​
​//自定义代理必须重新实现以下4个函数
​//创建编辑组件QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,const QModelIndex &index)const;
​//从数据模型获取数据,显示到代理组件中void setEditorData(QWidget *editor, const QModelIndex &index)const;
​//将代理组件的数据,保存到数据模型中void setModelData(QWidget *editor, QAbstractItemModel *model,const QModelIndex &index)const;
​//更新代理编辑组件的大小void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option,const QModelIndex &index)const;
​
};
#include "tspinboxdelegate.h"
​
#include    <QSpinBox>
​
TSpinBoxDelegate::TSpinBoxDelegate(QObject *parent): QStyledItemDelegate(parent)
{
​
}
​
QWidget *TSpinBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option,const QModelIndex &index) const
{ //创建代理编辑组件Q_UNUSED(option);Q_UNUSED(index);
​QSpinBox *editor = new QSpinBox(parent); //创建一个QSpinBoxeditor->setFrame(false); //设置为无边框editor->setMinimum(0);editor->setMaximum(50000);
​return editor;  //返回此编辑器
}
​
//从数据模型获取数据,显示到代理组件中
void TSpinBoxDelegate::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);   //设置编辑器的数值
}
​
//将代理组件的数据,保存到数据模型中
void TSpinBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,const QModelIndex &index) const
{QSpinBox *spinBox = static_cast<QSpinBox*>(editor);     //强制类型转换
//    spinBox->interpretText();       //解释数据,如果数据被修改后,就触发信号int value = spinBox->value();   //获取spinBox的值model->setData(index, value, Qt::EditRole);     //更新到数据模型
}
​
​
//设置组件大小
void TSpinBoxDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option,const QModelIndex &index) const
{Q_UNUSED(index);editor->setGeometry(option.rect);
}

在主窗口中

    intSpinDelegate= new TSpinBoxDelegate(this);ui->tableView->setItemDelegateForColumn(0, intSpinDelegate);    //测深
​floatSpinDelegate = new TFloatSpinDelegate(this);ui->tableView->setItemDelegateForColumn(1, floatSpinDelegate);  //垂深ui->tableView->setItemDelegateForColumn(2, floatSpinDelegate);  //方位ui->tableView->setItemDelegateForColumn(3, floatSpinDelegate);  //总位移

然后在外面编辑的时候:

就会弹出来这个了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/615.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

token无感刷新+处理并发的后端方案

问题描述&#xff1a; 当用户通过登陆后进入一个web网站&#xff0c;会把token保存到localStorage。假设token过期时间30min。 那么当用户在网站快乐地玩耍了30min后&#xff0c;这时进行了一次提交表单&#xff0c;它会被重定向到登陆页面。 作为用户&#xff1a;我表单填了…

VMware虚拟机Debian扩展磁盘

一、 版本 VMware&#xff1a;Workstation 17 Pro虚拟机&#xff1a;Debian11 二、 VMware虚拟机扩展 虚拟机关机状态快照或者备份&#xff1a;以免扩容失败导致文件丢失虚拟机——设置——硬盘——磁盘使用工具——扩展——扩展磁盘容量——设置为想要的大小 三、 虚拟机…

L1-2 什么是机器学习

L1-2 什么是机器学习 作者 陈越 单位 浙江大学 什么是机器学习&#xff1f;上图展示了一段面试官与“机器学习程序”的对话&#xff1a; 面试官&#xff1a;9 10 等于多少&#xff1f; 答&#xff1a;3 面试官&#xff1a;差远了&#xff0c;是19。 答&#xff1a;16 面试…

ssm基于WEB的人事档案管理系统的设计与实现+jsp

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码请私聊我 需要定制请私聊 目 录 1 绪论 1 1.1 选题背景 1 1.2 选题意义 1 1.3 研究内容 2 2 系统开发技术 3 2.1 MySQL数据库 3 2.…

WireShark入门学习笔记

学习视频&#xff1a;WireShark入门使用教程 文章目录 WireShark介绍WireShark抓包入门操作WireShark过滤器使用WireShark之ARP协议分析WireShark之ICMP协议TCP连接的3次握手协议TCP连接断开的4次挥手协议WireShark抓HTTP协议黑客利用WireShark获取用户密码实战 WireShark介绍…

vue3中使用mqtt数据传输(封装)

使用版本 "mqtt": "^5.8.0",安装指令 npm install mqtt --save ------ yarn add mqtt介绍mqtt 参考使用文档 配置 connection: {protocol: "ws",host: "broker.emqx.io",port: 8083,endpoint: "/mqtt",clean: true,con…

《Baichuan-Omni》论文精读:第1个7B全模态模型 | 能够同时处理文本、图像、视频和音频输入

技术报告Baichuan-Omni Technical ReportGitHub仓库地址 文章目录 论文摘要1. 引言简介2. 训练2.1. 高质量的多模态数据2.2. 多模态对齐预训练2.2.1. 图像-语言分支2.2.2. 视频语音分支2.2.3. 音频语言分支2.2.4. 图像-视频-音频全方位对齐 2.3. 多模态微调监督 3. 实验3.1. 语…

计算机的一些基础知识

文章目录 编程语言 程序 所谓程序&#xff0c;就是 一组指令 以及 这组指令要处理的数据。狭义上来说&#xff0c;程序对我们来说&#xff0c;通常表现为一组文件。 程序 指令 指令要处理的数据。 编程语言发展 机器语言&#xff1a;0、1 二进制构成汇编语言&#xff1a;…

苏州金龙新V系客车创新引领旅游出行未来

10月25日&#xff0c;为期三天的“2024第六届旅游出行大会”在风景秀丽的云南省丽江市落下帷幕。本次大会由中国旅游车船协会主办&#xff0c;全面展示了中国旅游出行行业最新发展动态和发展成就&#xff0c;为旅游行业带来全新发展动力。 在大会期间&#xff0c;备受瞩目的展车…

【重生之我要苦学C语言】深入理解指针4

深入理解指针4 字符指针变量 指针指向字符变量 char ch w; char* p &ch;指针指向字符数组 char arr[10] "abcdef"; char* p arr;printf("%s\n", arr); printf("%s\n", p);结果是一样的 也可以写成&#xff1a; char* p "abc…

Java | Leetcode Java题解之第525题连续数组

题目&#xff1a; 题解&#xff1a; class Solution {public int findMaxLength(int[] nums) {int maxLength 0;Map<Integer, Integer> map new HashMap<Integer, Integer>();int counter 0;map.put(counter, -1);int n nums.length;for (int i 0; i < n;…

Docker部署学习

目录 前言 一、实验环境准备 二、Docker常见命令 三、Docker数据卷 四、Docker自定义镜像 五、Docker网络相关 六、Docker项目部署实践 七、Docker知识追问强化 前言 1. Docker是用以项目上线部署的工具 2. Docker并不会很难&#xff0c;只要你跟着将所有的命令敲一遍…

二叉树和堆

目录 1.二叉树的概念及结构 1.1概念 1.2特殊的二叉树 1.3二叉树的性质 1.4二叉树的存储结构 2.二叉树的顺序结构及实现&#xff08;堆&#xff09; 2.1二叉树的顺序结构 2.2堆的概念及结构 2.3堆的实现 2.3.1堆的插入 2.3.2堆的删除 2.3.3 Heap.h 2.3.4 Heap.c 2.…

linux驱动-输入子系统框架分析

接下来&#xff0c;来分析三个结构体 打开这个文件drivers\input\evdev.c 第一步&#xff1a;要找到它的入口函数evdev_init 看到了&#xff0c;入口的位置注册了一个 input_handler&#xff0c;并且对里面的值完成赋值&#xff0c;和之前学习&#xff0c;我自己注册platform驱…

【sqlmap使用】

sqlmap简介 sqlmap 目录结构 sqlmap常用参数 sqlmap实现注入 测试注入点&#xff0c;检测到注入点后&#xff0c;直接爆数据库名 python sqlmap.py –u http://172.16.12.2/7/9/strsql.php --data "usernameadmin" --dbs注意sqlmap在使用过程中可能会出现几个需要…

Redis为什么用跳表实现有序集合

Redis为什么用跳表实现有序集合 手写一个跳表 为了更好的回答上述问题以及更好的理解和掌握跳表&#xff0c;这里可以通过手写一个简单的跳表的形式来帮助读者理解跳表这个数据结构。 我们都知道有序链表在添加、查询、删除的平均时间复杂都都是 O(n) 即线性增长&#xff0c…

微服务核心——网关路由

目录 前言 一、登录存在的问题归纳 二、*微服务网关整体方案 三、认识微服务网关 四、网关鉴权实现 五、OpenFeign微服务间用户标识信息传递实现 六、微服务网关知识追问巩固 前言 本篇文章具体讲解微服务中网关的实现逻辑、用于解决什么样的问题。其中标题中标注* 涉…

消息中间件类型介绍

ActiveMQ&#xff1a; ActiveMQ可是个老将了&#xff0c;它功能全面、稳定可靠&#xff0c;还支持多种协议和编程语言。如果你需要一个兼容性好、易于集成的消息中间件&#xff0c;ActiveMQ可是个不错的选择。 RabbitMQ&#xff1a; RabbitMQ以其简单易用和高性能著称。它支持丰…

5G在汽车零部件行业的应用

5G技术在汽车零部件行业的应用正在不断深入&#xff0c;为行业的智能化、自动化和高效化转型提供了强大的技术支持。 1、5G技术特点与优势 5G技术具有高速度、低延迟、大连接和切片技术等特点与优势。这些特性为汽车零部件行业提供了稳定、可靠、高效的通信连接&#xff0c;使…

MySQL【二】

查询列 SELECT [ALL | DISTINCT ] * | 列名1[,……列名n] FROM 表名; 查询所有选课学生的学号&#xff0c;结果去除重复值 select distinct sno from sc; 选择行 查询满足条件的数据集 SELECT 字段列表 FROM 表名 WHERE 查询条件 查询不属于数学系或外国语系的学生全部信息 …