Qt 自定义代理类
一.使用步骤
继承QStyledItemDelegate类:首先创建一个新的类并继承自QStyledItemDelegate类,作为您的自定义代理类。
实现代理类的构造函数:在代理类中实现构造函数,并在构造函数中调用基类的构造函数,可以选择传入一个QObject类型的父对象。
重写需要定制的函数:根据您的需求,重写QStyledItemDelegate类中的需要进行定制的函数。常用的函数包括paint、sizeHint、createEditor等。根据您的需求决定需要重写哪些函数。
修改绘制逻辑(可选):在重写的paint函数中修改绘制逻辑,根据数据的类型或特定条件进行不同的绘制操作。例如,在上面的例子中,根据数据类型添加货币符号。
在视图中应用代理:将您自定义的代理类设置给视图部件的setItemDelegate()函数,这样视图中的数据显示就会按照您的定制进行展示。
调试和优化:在应用自定义代理后,可以进行调试和优化,确保显示效果符合预期。
二.具体实现
1.继承QStyledItemDelegate类:
class CurrencyDelegate : public QStyledItemDelegate
{
public:CurrencyDelegate(QObject *parent = nullptr) : QStyledItemDelegate(parent){}
};
问题1:CurrencyDelegate(QObject *parent = nullptr) : QStyledItemDelegate(parent)参入如何传递
在上面的例子中,通过CurrencyDelegate类的构造函数,将parent参数传递给QStyledItemDelegate的构造函数,从而在实例化CurrencyDelegate时,也对QStyledItemDelegate进行了初始化。这种方式可以确保自定义代理类和基类之间的关联,使得自定义代理类可以继承QStyledItemDelegate的属性和行为。
2.对代理类进行实现:
对继承的父类的函数进行重写。
//创建代理编辑器
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;
示例如下:
/创建代理组件的时候,调用这个虚函数
QWidget *QIntSalaryDelagate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{//不使用参数Q_UNUSED(option);Q_UNUSED(index);QSpinBox*editor=new QSpinBox(parent);editor->setFrame(false);//无边框editor->setMinimum(2000);editor->setMaximum(100000);editor->setSingleStep(100);return editor;
}void QIntSalaryDelagate::setEditorData(QWidget *editor, const QModelIndex &index) const
{int value = index.model()->data(index).toInt();//数据模型中的数据QSpinBox*spinBox=static_cast<QSpinBox*>(editor);//这是上面创建的东西spinBox->setValue(value);}void QIntSalaryDelagate::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);}void QIntSalaryDelagate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{editor->setGeometry(option.rect);//就原来的位置
}
代码解读:
int value = index.model()->data(index).toInt();
这段代码的作用是从数据模型中获取特定索引处的数据,并将其转换为整数类型。
index.model():通过QModelIndex对象的model()方法获取索引所属的数据模型。data(index):通过数据模型的data()方法获取指定索引位置的数据。toInt():将获取到的数据转换为整数类型。因此,
int value将存储从数据模型中获取的指定索引位置的数据,并转换为整数类型,以便在后续代码中使用。
问题: 代理就是对模型的数据进行二次加工,然后以另外一种方式放回到模型中吗
代理(Delegate)在模型视图编程中扮演着重要角色,用于对模型的数据进行二次加工或自定义呈现方式,使其能够以不同的方式呈现给视图控件(如表格、列表等)。代理常用于定制数据的展示形式、编辑方式或交互行为。
在您提供的代码中,
QIntSalaryDelagate代理的setEditorData函数就是一个很好的例子。它通过获取模型中的数据并将其设置到编辑器小部件中,实现了以特定方式呈现数据给用户进行编辑的功能。编辑器中修改后的数据经过处理后可以再次存回到模型中。因此,代理可用于数据的二次处理、自定义展示逻辑以及用户交互的控制,使模型能够以更灵活、符合需求的方式与视图进行交互。
三. static_cast<>介绍
static_cast<>是 C++ 中的一种类型转换操作符,用于执行编译时的静态类型转换。它可以进行标准数据类型之间的转换(例如整数转换为浮点数)、基类指针或引用到派生类指针或引用的转换等。
QSpinBox* spinBox = static_cast<QSpinBox*>(editor);
这行代码将 editor 作为 QWidget 类型的指针,转换为 QSpinBox 类型的指针。这种类型转换是在编译时进行的,因此需要开发者明确确认这两种类型之间存在继承或兼容关系,否则会造成编译错误。
示例分析:
#include <iostream>class Base {
public:virtual void display() {std::cout << "Base class" << std::endl;}
};class Derived : public Base {
public:void display() override {std::cout << "Derived class" << std::endl;}
};int main() {Base baseObj;Derived derivedObj;Base* basePtr = &derivedObj;Derived* derivedPtr = static_cast<Derived*>(basePtr);derivedPtr->display(); // Output: "Derived class"return 0;
}
在上面的示例中,我们创建了一个基类 Base 和一个派生类 Derived。通过将 Derived 类对象的地址赋给 Base 类指针,我们可以使用 static_cast 将其转换回 Derived 类指针,并调用 Derived 类的成员函数。
需要注意的是,对于存在多态的情况(基类有虚函数,派生类重写了这些虚函数),最好使用 dynamic_cast 进行转换,因为 dynamic_cast 运行时执行类型检查,能够确定是否安全进行类型转换。
相关文章:
Qt 自定义代理类
一.使用步骤 继承QStyledItemDelegate类:首先创建一个新的类并继承自QStyledItemDelegate类,作为您的自定义代理类。 实现代理类的构造函数:在代理类中实现构造函数,并在构造函数中调用基类的构造函数,可以选择传入一…...
android GridLayout 布局详解,并举例
GridLayout 是 Android 中的一个布局容器,它允许你在一个二维网格中排列子视图。你可以指定网格的行数和列数,或者让 GridLayout 自动计算它们。每个子视图都可以占据一个或多个网格单元格。GridLayout 非常适合在需要创建规则网格的应用中使用ÿ…...
el-transfer和el-tree进行结合搞一个树形穿梭框
由于业务需求需要在穿梭框里使用树形结构,但是本身element里并不支持,于是参考了别的大佬发的文章作为思路及后续自己新增了一些处理功能。 目录 1.拷贝代码放到自己的项目目录中 2.改造el-transfer的源码 3.修改tree-transfer-panel.vue文件 4.修改…...
编一个自己的万年历
编一个自己的万年历 前阶段突然想查一下某一天是星期几,于是自己编了一个[小程序][https://blog.csdn.net/weixin_41905135/article/details/138972055?spm1001.2014.3001.5501],但是功能很单一,就是单纯的查是星期几。(虽然用网…...
Golang gin框架中间件c.JSON返回结果后终止返回
gin框架中间件c.JSON返回结果后还是会继续执行之后的方法,我们可以用c.Abort()来终止后续的处理 func MiddlewareFunction(c *gin.Context) {// 假设有某种条件下需要返回错误if someCondition {c.JSON(http.StatusBadRequest, gin.H{"error": "som…...
码蹄集部分题目(2024OJ赛16期;单调栈集训+差分集训)
🧀🧀🧀单调栈集训 🥪单调栈 单调递增栈伪代码: stack<int> st; for(遍历数组) {while(栈不为空&&栈顶元素大于当前元素)//单调递减栈就是把后方判断条件变为小于等于即可{栈顶元素出栈;//同时进行其他…...
安卓玩机搞机技巧综合资源----自己手机制作证件照的几种方法 免费制作证件照
接上篇 安卓玩机搞机技巧综合资源------如何提取手机分区 小米机型代码分享等等 【一】 安卓玩机搞机技巧综合资源------开机英文提示解决dm-verity corruption your device is corrupt. 设备内部报错 AB分区等等【二】 安卓玩机搞机技巧综合资源------EROFS分区格式 小米红…...
揭秘循环购模式:消费返利新玩法,引领电商新潮流
在当今的消费市场中,有一种商业模式引起了广大消费者的热烈讨论——那就是循环购模式。你可能会想,消费满千元就能得到两千元的福利,每天还能领取现金,这怎么可能呢?商家难道真的在“慷慨解囊”?今天&#…...
【制作100个unity游戏之26】unity2d横版卷轴动作类游13(附带项目源码)
最终效果 系列导航 文章目录 最终效果系列导航前言存储点灯光后处理存储位置信息存储更多数据存储场景信息持久化存储数据引入Unity 的可序列化字典类调用 游戏结束源码完结 前言 欢迎来到【制作100个Unity游戏】系列!本系列将引导您一步步学习如何使用Unity开发各…...
Golang使用HTTP框架zdpgo_resty实现文件下载
核心代码 代码解析: client.SetOutputDirectory("Downloads") 设置下载目录client.R().SetOutput("test.go").Get("http://127.0.0.1:3333/download 指定下载文件名并进行下载 // 设置输出目录路径,如果目录不存在ÿ…...
提取COCO 数据集的部分类
1.python提取COCO数据集中特定的类 安装pycocotools github地址:https://github.com/philferriere/cocoapi pip install githttps://github.com/philferriere/cocoapi.git#subdirectoryPythonAPI若报错,pip install githttps://github.com/philferriere…...
高刚性滚柱直线导轨有哪些优势?
滚柱导轨是机械传动系统中用于支持和引导滑块或导轨的装置,承载能力较高、刚性强及高精度等特点。特别适用于大负载和高刚性的工业设备,如机床、数控机床等设备,这些优势使其在工业生产和机械设备中得到了广泛的应用。 1、高精度:…...
KNN及降维预处理方法LDA|PCA|MDS
文章目录 基本原理模型介绍模型分析 python代码实现降维处理维数灾难 curse of dimensionality线性变换 Linear TransformationLDA - 线性判别分析LDA python 实现PCA - 主成分分析PCA最近重构性PCA最大可分性PCA求解及说明PCA python实现 多维缩放 Multiple Dimensional Scali…...
论文精读-SwinIR Image Restoration Using Swin Transformer
论文精读-SwinIR: Image Restoration Using Swin Transformer SwinIR:使用 Swin Transformer进行图像恢复 参数量:SR 11.8M、JPEG压缩伪影 11.5M、去噪 12.0M 优点:1、提出了新的网络结构。它采用分块设计。包括浅层特征提取:cnn提取&#…...
解释Spring Bean的生命周期
Spring Bean的生命周期涉及到Bean的创建、配置、使用和销毁的各个阶段。理解这个生命周期对于编写高效的Spring应用和充分利用框架的功能非常重要。下面是Spring Bean生命周期的主要步骤: 1. 实例化Bean Spring容器首先将使用Bean的定义(无论是XML、注…...
CTF网络安全大赛web题目:字符?正则?
题目来源于:bugku 题目难度:难 题目描 述: 字符?正则? 题目htmnl源代码: <code><span style"color: #000000"> <span style"color: #0000BB"><?php <br />highl…...
Linux——Docker容器虚拟化平台
安装docker 安装 Docker | Docker 从入门到实践https://vuepress.mirror.docker-practice.com/install/ 不需要设置防火墙 docker命令说明 docker images #查看所有本地主机的镜像 docker search 镜像名 #搜索镜像 docker pull 镜像名 [标签] #下载镜像&…...
Transformer详解(3)-多头自注意力机制
attention multi-head attention pytorch代码实现 import math import torch from torch import nn import torch.nn.functional as Fclass MultiHeadAttention(nn.Module):def __init__(self, heads8, d_model128, droput0.1):super().__init__()self.d_model d_model # 12…...
运用HTML、CSS设计Web网页——“西式甜品网”图例及代码
目录 一、效果展示图 二、设计分析 1.整体效果分析 2.头部header模块效果分析 3.导航及banner模块效果分析 4.分类classify模块效果分析 5.产品展示show模块效果分析 6.版权banquan模块效果分析 三、HTML、CSS代码分模块展示 1. 头部header模块代码 2.导航及bann…...
大语言模型是通用人工智能的实现路径吗?【文末有福利】
相关说明 这篇文章的大部分内容参考自我的新书《解构大语言模型:从线性回归到通用人工智能》,欢迎有兴趣的读者多多支持。 关于大语言模型的内容,推荐参考这个专栏。 内容大纲 相关说明一、哲学与人工智能二、内容简介三、书籍简介与福利粉…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
