【qt】自定义代理类

自定义代理类

  • 一.应用场景
  • 二.创建自定义代理类
    • 1.创建一个类
    • 2.共有继承父类
    • 3.添加宏
    • 4.初始化父类
    • 5.拿到我们需要重写的虚函数
  • 三.实现父类的4个虚函数
    • 1.创建代理组件
    • 2.设置代理组件数据
    • 3.设置模型数据
    • 4.跟新代理组件的位置
  • 四.使用代理类
    • 1.头文件
    • 2.私有成员
    • 3.视图设置代理
  • 五.其他列添加代理
    • 1.绩效
      • ①.创建代理
      • ②设置代理数据
      • ③设置模型数据
      • ④跟新代理位置
      • ⑤使用代理
    • 2.性别和岗位
      • ①.创建代理
      • ②设置代理数据
      • ③设置模型数据
      • ④跟新代理位置
      • ⑤使用代理
    • 3.生日
      • ①.创建代理
      • ②设置代理数据
      • ③设置模型数据
      • ④跟新代理位置
      • ⑤使用代理
  • 六.总结

一.应用场景

当我们希望在视图中添加一些组件时,可以使用到自定义代理。
在这里插入图片描述
我们可以在上个案例的基础上来进行修改,需要蔬菜的可以dd我,这里使用了另外一个txt文件
,使用我们上次的源代码需要改。
文本文件的表头是7列,所以我们改成7。
在这里插入图片描述
插入和添加行的信息也需要修改。

在这里插入图片描述
OK,准备工作就做好了。

二.创建自定义代理类

1.创建一个类

在这里插入图片描述
取个名就行了。
在这里插入图片描述

2.共有继承父类

在刚刚创建的类的头文件中
记得加头文件

#ifndef QSALAYDELEGATE_H
#define QSALAYDELEGATE_H#include <QStyledItemDelegate>//用来自定义代理的父类头文件class QSalayDelegate:public QStyledItemDelegate
{
public:QSalayDelegate();
};

3.添加宏

class QSalayDelegate:public QStyledItemDelegate
{Q_OBJECT
public:QSalayDelegate();
};

4.初始化父类

class QSalayDelegate:public QStyledItemDelegate
{Q_OBJECT
public:QSalayDelegate(QObject*perant=0);
};

在cpp文件中:

QSalayDelegate::QSalayDelegate(QObject*perant):QStyledItemDelegate(perant)
{}

5.拿到我们需要重写的虚函数

进入到父类中
在这里插入图片描述
将这4个虚函数拿到刚刚创建头文件中!
在这里插入图片描述
头文件中

#ifndef QSALAYDELEGATE_H
#define QSALAYDELEGATE_H#include <QStyledItemDelegate>class QSalayDelegate:public QStyledItemDelegate
{Q_OBJECT
public:QSalayDelegate(QObject*perant=0);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;
};#endif // QSALAYDELEGATE_H

代理类的准备工作就做好了,接下来就是重点了!

三.实现父类的4个虚函数

1.创建代理组件

可以直接在cpp中生成定义
在这里插入图片描述
我们这里是想对薪资来添加一个自定义代理组件,所以我们可以使用SpinBox组件

QWidget *QSalayDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{QSpinBox *editor=new QSpinBox(parent);//创建一个代理组件//可以对组件设置一些属性editor->setMinimum(2000);//最小薪资editor->setMaximum(100000);//最大薪资editor->setSingleStep(100);//每次可以加一百return editor;
}

2.设置代理组件数据

我们要想要设置代理组件的数据,我们可以通过拿到模型的数据来设置

void QSalayDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{QSpinBox *spinBox=static_cast<QSpinBox *>(editor);//因为参数editor的类型是祖宗所以我们要强制类型转换int value=index.model()->data(index).toUInt();//通过模型索引拿到模型数据spinBox->setValue(value);//设置代理组件数据
}

看注释哈,我写的这么详细!

3.设置模型数据

我们要想设置模型数据,我们可以先拿到代理的数据来设置

void QSalayDelegate::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);//设置模型数据
}

4.跟新代理组件的位置

void QSalayDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{editor->setGeometry(option.rect);//默认的位置就是在单元格的矩形位置
}

四.使用代理类

1.头文件

在mainwindow.h中

#include "qsalaydelegate.h"

2.私有成员

在这里插入图片描述

3.视图设置代理

在mainwindow.cpp的构造函数中

//指定代理,通过列来指定,4列就是薪资ui->tableView->setItemDelegateForColumn(4,&salayDelegate);

运行结果:
在这里插入图片描述
这样我们的代理就添加好了!

五.其他列添加代理

1.绩效

准备工作都一样。

①.创建代理

QWidget *QFloatDelegate::createEditor (QWidget *parent,const QStyleOptionViewItem &option,const QModelIndex &index)const
{QDoubleSpinBox *editor=new QDoubleSpinBox(parent);editor->setMinimum(0);editor->setMaximum(5);editor->setSingleStep(0.1);editor->setDecimals(1);//设置小数点精度return editor;
}

②设置代理数据

void QFloatDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{QDoubleSpinBox *spinBox=static_cast<QDoubleSpinBox *>(editor);float value=index.model()->data(index).toFloat();spinBox->setValue(value);
}

③设置模型数据

void QFloatDelegate::setModelData(QWidget *editor,QAbstractItemModel *model,const QModelIndex &index) const 
{QDoubleSpinBox *spinBox=static_cast<QDoubleSpinBox *>(editor);float value=spinBox->value();QString str=QString::asprintf("%.1f",value);model->setData(index,value);
}

④跟新代理位置

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

⑤使用代理

ui->tableView->setItemDelegateForColumn(5,&floatDelegate);

运行结果:
在这里插入图片描述

2.性别和岗位

①.创建代理

QWidget *ComboBoxDelegate::createEditor(QWidget *parent,const QStyleOptionViewItem &option,const QModelIndex &index) const 
{QComboBox *editor=new QComboBox(parent);editor->addItem("软件工程师");editor->addItem("高级程序员");return editor;
}

如果我这样写会产生一个问题,那就是只能代理一列,我想要的效果是职业和性别都可以下拉框选择,所有这里我们不能写死了,可以通过成员数据来动态的传值!
可以在类中加入:
在这里插入图片描述
并且实现:

void ComboBoxDelegate::setList(QStringList list)
{this->list=list;
}
QWidget *ComboBoxDelegate::createEditor(QWidget *parent,const QStyleOptionViewItem &option,const QModelIndex &index) const 
{QComboBox *editor=new QComboBox(parent);editor->addItems(this->list);return editor;
}

②设置代理数据

void ComboBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const 
{QComboBox* comboBox=static_cast<QComboBox*>(editor);comboBox->setCurrentText(index.model()->data(index).toString());
}

③设置模型数据

void ComboBoxDelegate::setModelData(QWidget *editor,QAbstractItemModel *model,const QModelIndex &index) const 
{QComboBox* comboBox=static_cast<QComboBox*>(editor);model->setData(index,comboBox->currentText());
}

④跟新代理位置

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

⑤使用代理

mainwindow.h中要有头文件和添加数据成员
在这里插入图片描述

    comBoxGender.setList(QStringList{"男","女"});ui->tableView->setItemDelegateForColumn(1,&comBoxGender);comBoxJobs.setList(QStringList{"软件工程师","项目经理","高级程序员","助理"});ui->tableView->setItemDelegateForColumn(2,&comBoxJobs);

运行结果:
在这里插入图片描述
在这里插入图片描述
这个例子就讲了一个代理用在多列!

3.生日

①.创建代理

QWidget *QDateDelegate::createEditor(QWidget *parent,const QStyleOptionViewItem &option,const QModelIndex &index) const 
{QDateEdit*editor=new QDateEdit(parent);editor->setMinimumDate(QDate(1900,1,1));editor->setMaximumDate(QDate(2020,1,1));editor->setCalendarPopup(true);//设置弹出 日历return editor;
}

②设置代理数据

void QDateDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const 
{QDateEdit *dateEdit=static_cast<QDateEdit *>(editor);QString str=index.model()->data(index).toString();QDate date=QDate::fromString(str,"yyyy-MM-dd");dateEdit->setDate(date);
}

③设置模型数据

void QDateDelegate::setModelData(QWidget *editor,QAbstractItemModel *model,const QModelIndex &index) const 
{QDateEdit *dateEdit=static_cast<QDateEdit *>(editor);QDate date=dateEdit->date();model->setData(index,date.toString("yyyy-MM-dd"));
}

④跟新代理位置

void QDateDelegate::updateEditorGeometry(QWidget *editor,const QStyleOptionViewItem &option,const QModelIndex &index) const 
{QRect rect=option.rect;rect.setWidth(rect.width()*1.5);//将日历代理组件的宽度设为原来的1.5倍editor->setGeometry(rect);
}

⑤使用代理

ui->tableView->setItemDelegateForColumn(2,&dateDelegate);

运行结果:
在这里插入图片描述
OK,完结了!

六.总结

主要是知道代理的应用场景,和模板化套路。
在这里插入图片描述

优秀的公司赚取利润,伟大的公司赢得人心。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Web上机:JSP+Servlet+JDBC的交互流程

目录 需求与设计 基础需求&#xff1a; 项目结构&#xff1a; 项目逻辑&#xff1a; 运行图示&#xff1a; 代码实现 Login.jsp InsertServlet SelectServlet Table.jsp user mysql表结构 Web开发技术迭代速度日新月异&#xff0c;对于技术的更新往往是基于底层一…

基于Python+flask+echarts的气象数据采集与分析系统,可实现lstm算法进行预测

背景 基于PythonFlaskEcharts的气象数据采集与分析系统结合了强大的数据处理能力和可视化展示技术&#xff0c;旨在实现对气象数据的实时采集、存储和分析。通过Python编程语言实现数据采集模块&#xff0c;利用Flask框架搭建后端系统&#xff0c;实现数据处理、存储和分析功能…

Python小游戏——俄罗斯方块

文章目录 项目介绍环境配置代码设计思路1.初始化和导入库&#xff1a;2.定义颜色和屏幕尺寸&#xff1a;3.定义游戏逻辑&#xff1a;4.游戏循环&#xff1a; 源代码效果图 项目介绍 俄罗斯方块游戏是一款经典的益智游戏&#xff0c;玩家通过旋转和移动各种形状的方块&#xff…

深入剖析—【服务器硬件】与【Nginx配置】:从基础到实战

服务器硬件部分&#xff1a; Processor (CPU)&#xff1a;服务器的计算核心&#xff0c;负责处理数据和执行程序。Memory (RAM)&#xff1a;用于暂时存储和快速访问数据&#xff0c;决定了系统的运行速度和并发处理能力。Storage (HDD/SSD)&#xff1a;长期存储数据的设备&…

爱设计AiPPT.cn赵充:营销工作的AI进化

爱设计&AiPPT.cn是一家 AIGC 数字科技企业&#xff0c;致力于打造「下一代个人与组织的 Ai 工作站」 。目前旗下产品包括AiPPT.cn、爱设计AIGC 内容中台、365 编辑器、爱设计在线设计工具、AiH5 等超过 10 余款应用 AI 能力的内容创作工具。日前&#xff0c;爱设计&AiP…

期货学习笔记-横盘行情学习1

横盘行情的特征及分类 横盘行情的概念 横盘行情时中继形态的一种&#xff0c;一般常出现在大涨或大跌之后出现横盘行情是对当前趋势行情的修正&#xff0c;是对市场零散筹码的清理&#xff0c;是为了集中筹码更便于后期行情的展开 横盘行情的特征 1.水平运动&#xff1a;该…

从零自制docker-15-【实现 mydocker run -d 支持后台运行容器】

文章目录 实现目的莫名奇妙的问题对之前upper层出现root补充对run某些命令出现找不到文件或目录的原因代码效果 实现目的 docker run -d时容器在后台运行&#xff0c;而不会进入命令行交互形式 首先是需要添加-d选项然后设置当添加-d选项时候主进程不会等待子进程&#xff0c…

从Python代码到pip包:打包Python项目

大家好&#xff0c;在软件开发的世界中&#xff0c;共享和重用代码是至关重要的。Python社区为我们提供了丰富的资源&#xff0c;使得我们能够轻松地与他人分享我们的工作&#xff0c;并从他人的工作中受益。将代码打包成pip包&#xff08;Python包管理器&#xff09;是一种常见…

Moto和Inter字节序

inter: 低地址按照start_bit位放低字节依次往高字节填充 MotoLsb: 低地址按照start_bit位放高字节&#xff0c;依次往低字节填充MotoMsb&#xff1a;高字节按照start_bit位放低地址&#xff0c;依次往高字节填充

uni-app实现页面之间的跳转传参(八)

界面之间的参数传递在 开发中经常会用到,这节主要将一下uni-app开发应用是的传参情况。如下图所示,我的一级界面将点检分成三类:日点检、周点检和年保养;在点击相应的会导航到相应的功能。 在uni-app中常用的方法有uni.navigateTo(OBJECT)、uni.redirectTo(OBJECT);简单的…

怎么图片转excel表格免费?介绍三个方法

怎么图片转excel表格免费&#xff1f;在日常工作中&#xff0c;我们经常需要将图片中的表格数据转化为可编辑的Excel格式。幸运的是&#xff0c;市面上有多款软件支持这一功能&#xff0c;并且部分软件还提供免费使用的选项。本文将为您详细介绍几款可以免费将图片转换为Excel表…

Flink DataStream API 介绍

一、介绍 官网 DataStream API 得名于特殊的 DataStream 类&#xff0c;该类用于表示 Flink 程序中的数据集合。你可以认为 它们是可以包含重复项的不可变数据集合。这些数据可以是有界&#xff08;有限&#xff09;的&#xff0c;也可以是无界&#xff08;无限&#xff09;的…

快速排序算法备考

快排模板 快速排序(快排) (C语言实现)_c语言快速排序_Brant_zero2022的博客-CSDN博客 快排使用递归来实现 关键思想:划分 //划分 int partion(int A[],int L,int R){int midA[L];while(L<R){//每一次划分:左边元素<枢轴元素<右边元素//R往前找&#xff0c;直到找到一…

IO系列(八) -浅析NIO工作原理

一、简介 现在使用 NIO 的场景越来越多&#xff0c;很多网上的技术框架或多或少的使用 NIO 技术&#xff0c;譬如 Tomcat、Jetty、Netty&#xff0c;学习和掌握 NIO 技术已经不是一个 Java 攻城狮的加分技能&#xff0c;而是一个必备技能。 那什么是 NIO 呢&#xff1f; NIO…

不拍视频,不直播怎么在视频号卖货赚钱?开一个它就好了!

大家好&#xff0c;我是电商糖果 视频号这两年看着抖音卖货的热度越来越高&#xff0c;也想挤进电商圈。 于是它模仿抖音推出了自己的电商平台——视频号小店。 只要商家入驻视频号小店&#xff0c;就可以在视频号售卖商品。 具体怎么操作呢&#xff0c;需要拍视频&#xf…

Redis实践—全国地址信息缓存

一、背景 在涉及全国地址的应用中&#xff0c;地址信息通常被频繁地查询和使用&#xff0c;例如电商平台、物流系统等。为了提高系统性能和减少对数据库的访问压力&#xff0c;可以使用缓存来存储常用的地址信息&#xff0c;其中 Redis 是一个非常流行的选择。 本次在一个企业入…

就业信息|基于SprinBoot+vue的就业信息管理系统(源码+数据库+文档)

就业信息管理系统 目录 基于SprinBootvue的就业信息管理系统 一、前言 二、系统设计 三、系统功能设计 1前台功能模块 2后台功能模块 4.2.1管理员功能 4.2.2学生功能 4.2.3企业功能 4.2.4导师功能 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设…

[力扣]——70.爬楼梯

题目描述&#xff1a; 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 本题较为简单&#xff0c;主要用到递归思想 int fun(int n,int memo[]) {if(memo[n]!-1) //如果备忘录中已经有记录了…

学 Go 具体能干什么?

学习 Go (Golang) 后&#xff0c;你可以从事许多不同的工作和项目&#xff0c;Go 语言以其高性能、并发处理和简洁的语法而闻名&#xff0c;特别适合以下几个领域&#xff1a; 1. 后端开发 Go 在后端开发中非常流行&#xff0c;特别适合构建高性能的 Web 服务和 API。 Web 框…

安卓获取内部存储信息

目录 前言获取存储容量 前言 原生系统设置里的存储容量到底是怎么计算的&#xff0c;跟踪源码&#xff0c;涉及到VolumeInfo、StorageManagerVolumeProvider、PrivateStorageInfo、StorageStatsManager......等等&#xff0c;java上层没有办法使用简单的api获取到吗&#xff1f…