QItemDelegate

一、简介

二、使用 QItemDelegate 的基本步骤

2.1、创建 Item 视图和模型

2.2、创建自定义的委托类

2.3、应用委托类到 Item 视图

三、实例:定制化 Item 视图

一、简介
        当我们需要在 Qt 应用程序中自定义 Item 视图的外观和交互行为时,QItemDelegate 类是一个非常有用的工具。它允许开发者以特定的方式显示和编辑数据,为 Item 视图提供了灵活的定制选项。

        QItemDelegate 类是 Qt 框架中的一个委托类,用于控制 Item 在视图中的显示和编辑方式。它是 Model/View 架构中的一部分,通过与模型和视图的交互,实现对 Item 的定制。QItemDelegate 类的主要作用是为 Item 提供绘制、编辑和交互的功能,并通过重写相关的虚函数来实现自定义行为。

二、使用 QItemDelegate 的基本步骤
2.1、创建 Item 视图和模型
        在使用 QItemDelegate 前,我们首先需要创建 Item 视图和模型。我们可以选择使用任何适合的 Item 视图类,如 QTableView、QTreeView 或 QListView,并创建相应的模型来存储数据。

QStandardItemModel* model = new QStandardItemModel(this);
model->setColumnCount(2);
model->setHeaderData(0, Qt::Horizontal, "Name");
model->setHeaderData(1, Qt::Horizontal, "Age");
 
QTableView* tableView = new QTableView(this);
tableView->setModel(model);
2.2、创建自定义的委托类
        接下来,我们需要创建一个自定义的委托类,继承自 QItemDelegate,并重写其虚函数以实现定制化的显示和编辑逻辑。例如,我们可以定制某一列的显示样式,或者添加特定的交互行为。

class CustomDelegate : public QItemDelegate
{
public:
    explicit CustomDelegate(QObject* parent = nullptr)
        : QItemDelegate(parent)
    {
    }
 
    void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override
    {
        // 自定义绘制逻辑
    }
 
    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
    {
        // 自定义编辑器数据保存逻辑
    }
};

2.3、应用委托类到 Item 视图
        最后,我们将自定义的委托类应用到特定的列或 Item 视图中,以实现定制化的显示和编辑效果。

CustomDelegate* delegate = new CustomDelegate(this);
tableView->setItemDelegateForColumn(1, delegate);
        在上述代码中,我们将自定义的委托类 CustomDelegate 应用到第二列上,即 "Age" 列。这样,该列的显示和编辑效果将由 CustomDelegate 控制。

三、实例:定制化 Item 视图
        让我们通过一个实例来演示如何使用 QItemDelegate 定制化 Item 视图的外观和交互行为。假设我们有一个任务列表,其中包含任务名称和完成状态。我们希望定制化完成状态列的显示效果,使用自定义的图标来表示任务的完成状态,并提供一种交互方式来切换任务的完成状态。

        首先,我们创建一个自定义的委托类 TaskDelegate,继承自 QItemDelegate。在该委托类中,我们重写了 paint()、createEditor() 和 setModelData() 函数。

class TaskDelegate : public QItemDelegate
{
public:
    explicit TaskDelegate(QObject* parent = nullptr)
        : QItemDelegate(parent)
    {
    }
 
    void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override
    {
        if (index.column() == 1) {
            bool isCompleted = index.data().toBool();
 
            if (isCompleted) {
                // 绘制背景色
                painter->fillRect(option.rect, Qt::green);
            } else {
                // 绘制背景色
                painter->fillRect(option.rect, Qt::yellow);
            }
 
            // 绘制文本
            QString text = index.data().toString();
            painter->drawText(option.rect, Qt::AlignCenter, text);
        } else {
            QItemDelegate::paint(painter, option, index);
        }
    }
 
    QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const override
    {
        if (index.column() == 1) {
            // 创建自定义的编辑器,例如复选框
            QCheckBox* checkBox = new QCheckBox(parent);
            return checkBox;
        }
 
        return QItemDelegate::createEditor(parent, option, index);
    }
 
    void setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const override
    {
        if (index.column() == 1) {
            // 获取编辑器的值,更新数据模型
            QCheckBox* checkBox = qobject_cast<QCheckBox*>(editor);
            if (checkBox) {
                bool isCompleted = checkBox->isChecked();
                model->setData(index, isCompleted);
            }
        } else {
            QItemDelegate::setModelData(editor, model, index);
        }
    }
};
        然后,我们在主窗口中创建任务列表的模型和视图,并将自定义委托应用到完成状态列上。

QStandardItemModel* model = new QStandardItemModel(this);
model->setColumnCount(2);
model->setHeaderData(0, Qt::Horizontal, "Task");
model->setHeaderData(1, Qt::Horizontal, "Status");
 
QTableView* tableView = new QTableView(this);
tableView->setModel(model);
 
TaskDelegate* delegate = new TaskDelegate(this);
tableView->setItemDelegateForColumn(1, delegate);
        在上述代码中,我们创建了一个包含两列的任务列表模型,并设置了列标题。然后,我们创建了一个 QTableView,并将该模型设置为其数据源。接下来,我们创建了 `TaskDelegate` 的实例,并将其应用到第二列(状态列)上,以定制化显示和编辑效果。 最后,我们可以将任务数据添加到模型中,然后显示任务列表。

QStandardItem* task1 = new QStandardItem("Task 1");
QStandardItem* task2 = new QStandardItem("Task 2");
model->appendRow({task1, new QStandardItem(false)});
model->appendRow({task2, new QStandardItem(true)});
 
tableView->show();
        在上述代码中,我们创建了两个任务项,并将其添加到模型中。每个任务项包含任务名称和完成状态。通过调用 tableView->show(),我们将任务列表显示在界面上。

        通过以上的实例,我们展示了如何使用 QItemDelegate 定制化 Item 视图的外观和交互行为。通过重写委托类的函数,我们可以实现自定义的绘制、编辑和数据更新逻辑,以满足特定的需求。
————————————————

                            本文为博主原创文章,未经博主允许不得转载。
                        
原文链接:https://blog.csdn.net/baidu_18624493/article/details/130594393

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

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

相关文章

spring-security 过滤器

spring-security过滤器 版本信息过滤器配置过滤器配置相关类图过滤器加载过程创建 HttpSecurity Bean 对象创建过滤器 过滤器作用ExceptionTranslationFilter 自定义过滤器 本章介绍 spring-security 过滤器配置类 HttpSecurity&#xff0c;过滤器加载过程&#xff0c;自定义过…

LeetCode23.合并K个升序链表

题目 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 示例 &#xff1a; 输入&#xff1a;lists [[1,4,5],[1,3,4],[2,6]] 输出&#xff1a;[1,1,2,3,4,4,5,6] 解释&#xff1a;链表数组如下&…

Centos stream9 环境使用脚本部署LAMP,实现wordpress

本人将所需要的rpm包都下载完成之后&#xff0c;直接使用脚本的形式安装。 如果需要自己下载rpm包的话&#xff0c;请下载如下包 yum install -y libxml2-devel \ tar \ gcc \ expat-devel \ bzip2-devel \ pcre-devel \ openssl-devel \ perl-devel \ sqlite-devel \ libcur…

计算机服务器中了devos勒索病毒怎么办?Devos勒索病毒解密数据恢复

网络技术的不断发展与更新&#xff0c;为企业的生产运营提供了有利保障&#xff0c;企业的生产运营离不开数据支撑&#xff0c;通过企业数据可以综合调整发展运营方向&#xff0c;但网络是一把双刃剑&#xff0c;近期&#xff0c;云天数据恢复中心接到许多企业的求助&#xff0…

32.仿简道云公式函数实战-数学函数-MOD

1. MOD函数 返回两数相除的余数。 结果的符号与除数相同。 2. 函数用法 MOD(number, divisor) 3. 函数示例 返回两数相除的余数。 结果的符号与除数相同。 number: 必需。 要计算余数的被除数。 divisor: 必需。 除数。 4. 代码实战 首先我们在function包下创建math包…

Android 7.0以上charles无法抓取部分https包问题

首先保证配置一切正确 手机通过访问chls.pro/ssl下载.pem证书&#xff0c;如无法安装&#xff0c;在文件管理器中将后缀名改为.crt 在设置中安装该证书 Charles-Proxy - SSL Proxying Setting - Include 添加需要抓包的URL:443即可 以上基本配置结束后&#xff0c;看下代码 代…

vue实时监控视频播放的进度,并在播放80%位置触发相应操作

video标签&#xff1a;播放时触发canplay事件 <video:src"filePath"controlsv-if"filePrefix mp4 || filePrefix avi"canplay"getVideoDur()"id"myVideo"class"preview"></video>canplay触发的方法&#xff…

w28DVWA-csrf实例

DVWA-csrf实例 low级别 修改密码&#xff1a;修改的密码通过get请求&#xff0c;暴露在url上。 写一个简单的html文件&#xff0c;里面伪装修改密码的文字&#xff0c;代码如下&#xff1a; <html><body><a href"http://dvwa:7001/vulnerabilities/csr…

苍穹外卖学习-----2024/02/21

1.新增员工 /*** 处理SQL异常* param sqlIntegrityConstraintViolationException* return*/ExceptionHandlerpublic Result exceptionHandler(SQLIntegrityConstraintViolationException sqlIntegrityConstraintViolationException){//String message sqlIntegrityConstraintV…

SHERlocked93 的 2017 年终总结

回家的路上有点无聊&#xff0c;简短回顾一下2017年的得失收获 开始两个月3月到5月用C#完结了一个烂尾的wpf小项目&#xff0c;对自己前半年的.net生涯也算是一个句号&#xff08;虽然不知道最后有没有采用&#xff09;&#xff0c;后面由于项目组转变技术栈&#xff0c;选择了…

1 Nacos数据持久化方式

Nacos 支持两种数据持久化方式&#xff0c;一种是利用内置的数据库&#xff0c;另一种是利用外置的数据源。 1、内置数据库支持 Nacos 默认内置了一些数据存储解决方案&#xff0c;如内嵌的 Derby 数据库。 这种内置方式主要用于轻量级或测试环境。 2、外置数据库支持 对于生…

深入剖析Nginx:技术解析、最佳实践和高级使用指南(三)

本系列文章简介&#xff1a; 本系列文章通过分析Nginx的内部机制和原理&#xff0c;讲解了Nginx的架构、性能优化和高可用性配置等方面的知识。此外&#xff0c;还介绍了Nginx的最佳实践和高级使用技巧&#xff0c;帮助读者更好地理解和应用Nginx。本系列文章内容详实且深入&am…

【K8s】-- 查看节点池下面的所有宿主机

命令&#xff1a;kubectl -n 空间名称 --context 上下文名称 get nodes -l nodepool节点池名称 举例&#xff1a;kubectl -n my-flink --context prod-6 get nodes -l nodepoolbigdata-flink-xxl

基于springboot实现的音乐网站

一、系统架构 前端&#xff1a;html | js | css | bootstrap 后端&#xff1a;springboot | mybatis 环境&#xff1a;jdk1.8 | mysql | maven 二、 代码及数据库 三、功能介绍 01. 登录页 02. 用户注册 03. 首页 04. 喜欢 05. 查询

SQL笔记-多表查询(合并记录新增字段)

比如要统计2张表的所有数据&#xff0c;这两张表无关联关系&#xff0c;统计的数据需要在同一行&#xff1a; SELECT (SELECT COUNT(*) FROM reptile_csdn_article) AS table1_count, (SELECT COUNT(*) FROM reptile_tag_type) AS table2_count 运行截图如下&#xff1a; 大于…

UE开发01--part 1:创建游戏模式、角色、控制器

1&#xff0c;右键选择新建C类 2&#xff0c;选择GameModeBase 3&#xff0c;随便命名&#xff0c;类的类型-->选择&#xff1a;公共&#xff1b; 这个选项会把.h和.cpp文件分开&#xff0c;方便我们查看与修改代码。 4.打开 VS 编辑器&#xff0c;查看我们刚刚创建得两文件…

Echarts图例如何将选中与未选中状态配置成不同图形

背景 使用Echarts实现功能过程中&#xff0c;由于用户感觉Echarts图例的原生图案(例如圆形)不能直观地表现出该处可以点击筛选展示&#xff0c;故设计将选中的图例与未选中的图例设置成两种不同的图形(多为勾选与未勾选)。Echarts原生功能可以配置图例图案&#xff0c;但无法直…

设计模式----开题

简介&#xff1a; 本文主要介绍设计模式中的六大设计原则。开闭原则&#xff0c;里氏代换原则&#xff0c;依赖倒转原则&#xff0c;接口隔离原则&#xff0c;迪米特原则和合成复用原则。这几大原则是设计模式使用的基础&#xff0c;在使用设计模式时&#xff0c;应该牢记这六大…

Java实战:使用XML与注解方式实现CRUD操作

本文将详细介绍如何使用MyBatis框架&#xff0c;通过XML映射文件和注解两种方式来实现数据库的增删改查&#xff08;CRUD&#xff09;操作。我们将探讨MyBatis的配置和使用方法&#xff0c;并通过一个具体示例来演示如何使用XML和注解来完成基本的数据库操作。本文适合希望学习…

代码随想录刷题笔记-Day20

1. 二叉树的最近公共祖先 236. 二叉树的最近公共祖先https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/ 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#x…