Qt 实战(10)模型视图 | 10.5、代理

news2024/11/26 9:00:11

文章目录

  • 一、代理
    • 1、简介
    • 2、自定义代理

前言:

在Qt的模型/视图(Model/View)框架中,代理(Delegate)是一个非常重要的概念。它充当了模型和视图之间的桥梁,负责数据的显示和编辑。代理可以自定义单元格的绘制、数据呈现和编辑器的行为,使得视图更加灵活和个性化。

一、代理

1、简介

Qt中的代理主要分为两类:QItemDelegateQStyledItemDelegateQStyledItemDelegateQItemDelegate的改进版,提供了更好的样式支持,能够与平台的外观和感觉保持一致,因此通常推荐使用QStyledItemDelegate

使用代理时要创建一个继承自QStyledItemDelegate的代理类,并重新几个比较重要的虚函数,每个虚函数的功能如下:

// 创建编辑器:当用户触发编辑行为时,代理负责创建并返回相应的编辑器控件(如QLineEdit、QSpinBox、QComboBox等)。
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 paint(QPainter *painter, const QStyleOptionViewItem &option,
    const QModelIndex &index) const override;

2、自定义代理

下面给出一个具体的示例,讲下代理如何使用。创建一个QTableWidget对象,并给列表的"地址"列设置代理,如下:

  • 创建代理类

    创建一个代理类,并实现前面提到的比较核心的几个虚函数

    // MyAddrDelegate.h
    
    #include "MyAddrDelegate.h"
    #include <QComboBox>
    
    MyAddrDelegate::MyAddrDelegate(QObject *parent)
    {
    
    }
    
    QWidget *MyAddrDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
    {
        QComboBox *editor = new QComboBox(parent);
        if (editor == nullptr)
            return nullptr;
    
        QStringList itemList;
        itemList << QString("北京");
        itemList << QString("上海");
        itemList << QString("西安");
    
        editor->addItems(itemList);
        editor->setFrame(false);
        return editor;
    }
    
    void MyAddrDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
    {
        QComboBox *combox = static_cast<QComboBox*>(editor);
        combox->setCurrentIndex(combox->findText(index.model()->data(index, Qt::EditRole).toString()));
    }
    
    void MyAddrDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
    {
        model->blockSignals(true);
        QComboBox *combox = static_cast<QComboBox*>(editor);
        model->setData(index, combox->currentText(), Qt::EditRole);
        emit OnCurrentTextChanged(index.row(), index.column(), combox->currentText());
        model->blockSignals(false);
    }
    
  • 使用代理

    调用setItemDelegateForColumn()方法给"地址"列设置代理,如下:

    MyAddrDelegate *pAddrDelegate = new MyAddrDelegate();
    ui.m_pTableWidget->setItemDelegateForColumn(1, pAddrDelegate);
    
  • 实现效果

    给"地址"列设置代理,使用QComboBox控件作为编辑器

    在这里插入图片描述

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

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

相关文章

lenovo联想小新 潮7000-14AST(81GE)笔记本原厂Win10系统镜像安装包下载

适用机型&#xff1a;【81GE】 链接&#xff1a;https://pan.baidu.com/s/1ciGya7OjTN73rHFJs52WpQ?pwdkgk4 提取码&#xff1a;kgk4 联想原装出厂系统自带所有驱动、出厂主题壁纸、系统属性联机支持标志、系统属性专属LOGO标志、Office办公软件、联想电脑管家、联想浏览器…

C语言部分输入输出(printf函数与scanf函数,getchar与putchar详解,使用Linux ubuntu)

1.输入输出 1.1.按格式输入输出 printf 可以在man手册中查看 int printf(const char *format, ...); printf:函数名(参数)int:函数的返回值 功能&#xff1a;按格式在终端输出 参数&#xff1a;多参 返回值&#xff1a;输出字符个数 格式&#xff1a; %d int %c char…

Jmeter自动化实战

一、前言 由于系统业务流程很复杂,在不同的阶段需要不同的数据,且数据无法重复使用,每次造新的数据特别繁琐,故想着能不能使用jmeter一键造数据 二、创建录制模板 可参考:jmeter录制接口 首先创建一个录制模板 因为会有各种请求头,cookies,签名,认证信息等原因,导致手动复制…

【mysql】4-2. MySQL存储结构

MySQL存储结构 1 什么是表空间⽂件&#xff1f; 解答问题 表空间⽂件是⽤来存储表中数据的⽂件&#xff0c;表空间⽂件的⼤⼩由存储的数据多少决定&#xff0c;不同的表空间⽂件存储数据的种类也有所不同&#xff0c;在MySQL中表空间分为五类&#xff0c;包括&#xff1a;系统…

Ansible基本使用

目录 介绍 安装 inventory-主机清单 分组 子组 modules-模块 command shell script file copy systemd yum get_url yum_repository user mount cron 介绍 ansible是基于python开发的自动化运维工具。架构相对比较简单&#xff0c;仅需通过ssh连接客户机执行…

HivisionIDPhoto Docker部署以及Springboot接口对接(AI证件照制作)

项目简介 项目以及官方文档地址 HivisionIDPhoto 旨在开发一种实用、系统性的证件照智能制作算法。 它利用一套完善的AI模型工作流程&#xff0c;实现对多种用户拍照场景的识别、抠图与证件照生成。 HivisionIDPhoto 可以做到&#xff1a; 轻量级抠图&#xff08;纯离线&a…

DB-GPT系列(一):DB-GPT能帮你做什么?

DB-GPT是一个开源的AI原生数据应用开发框架(AI Native Data App Development framework with AWEL and Agents)&#xff0c;围绕大模型提供灵活、可拓展的AI原生数据应用管理与开发能力&#xff0c;可以帮助企业快速构建、部署智能AI数据应用&#xff0c;通过智能数据分析、洞察…

整理了一些大模型的课程,非常详细,大模型零基础入门到精通,收藏我这一篇就够了

目前有多个科普类的大模型课程&#xff0c;这些课程涵盖了从基础理论到实际应用的各个方面。以下是一些主要的科普类大模型课程&#xff1a;复旦大学“大模型开发与赋能”专题讲习班&#xff1a;由复旦大学计算机学院邱锡鹏教授带来的《大模型科普讲解》课程&#xff0c;通过深…

Chromium 中profile browser 和WebContents三者之间的关系c++

一、prfile介绍&#xff1a; 1、浏览器默认启动会创建一个默认的profile在Default目录下。 C:\Users\Administrator\AppData\Local\Chromium\User Data\Default目录下 【与窗口绑定】 proflie与N个browser对象绑定。 2、用户新建一个账户会在User Data目录下新建一个prfol…

el-datepicker此刻按钮点击失效

文章目录 此刻按钮失效原因&#xff1a;使用了禁用未来日期解决办法&#xff1a;重写此刻按钮点击事件代码&#xff08;包含禁用未来日期和时分秒的处理&#xff09;框出主要代码&#xff08;因为包含禁用日期功能&#xff09;&#xff08;取你所需&#xff09; 此刻按钮失效原…

shodan3,vnc空密码批量连接,ip历史记录查找

shodan语法&#xff0c;count&#xff0c;honeyscore count 今天带大家继续学习shodan&#xff0c;今天会带大家学一学这个count命令&#xff0c;再学学其他小命令好其实关键命令也没那么多&#xff0c;就是很方便记忆一下就学会了这样子。 shodan count "/x03/x00/x00…

node和npm

背景&#xff08;js&#xff09; 1、为什么js能操作DOM和BOM? 原因&#xff1a;每个浏览器都内置了DOM、BOM这样的API函数 2、浏览器中的js运行环境&#xff1f; v8引擎&#xff1a;负责解析和执行js代码 内置API&#xff1a;由运行环境提供的特殊接口&#xff0c;只能在所…

【Eclipse系列】eclipse快捷键和设置

本文以4.24版本为例&#xff0c;详细介绍一下常用快捷键&#xff0c;以及如何设置 一、常用快捷键 1.1、代码注释 Ctrl / &#xff1a;注释或取消当前行。Ctrl Shift C&#xff1a;注释或取消当前行。Ctrl Shift / &#xff1a;注释多行。Ctrl Shift \ &#xff1a;取…

图解Redis 05 | Zset数据类型的原理及应用场景

介绍 Zset 类型&#xff08;有序集合&#xff09;与 Set 类型相比&#xff0c;增加了一个排序属性 score。对于有序集合 Zset&#xff0c;每个元素由两个部分组成&#xff1a;一个是元素的值&#xff0c;另一个是用于排序的分数 score。 有序集合继承了Set中成员唯一&#xff…

1D+洪水淹没制图软件+山洪径流模拟与洪水危险性评价技术及典型地区洪水淹没及损失分析

1. 软件原理简介&#xff1a; 基于洪水频率计算得到的设计洪水成果&#xff0c;通过水位流量关系将常见年遇洪水的洪峰流量转化为水位&#xff0c;进一步结合洪泛平原DEM数据&#xff0c;采用GIS水文分析方法计算洪泛平原内任一栅格的水流流程&#xff0c;耦合一维水力学模拟计…

树莓派4处理器超频指南

概述 在树莓派4的系列硬件中&#xff0c;处理器都是基于Broadcom BCM2711&#xff0c;内部具有4个ARM Cortex-A72和VideoCore VI。如果仔细看&#xff1a;树莓派4B开发板用的是BCM2711B0&#xff0c;主频为 1.5GHz&#xff1b;而Pi 400&#xff08;Keyboard Computer&#xff…

【华为\荣耀、中兴、华三路由器IPV6设置】

华为\荣耀、中兴、华三路由器ipv6设置 华为\荣耀设置-路由器拨号情况下中兴设置-路由器拨号情况下华三设置-光猫拨号情况下&#xff08;待续&#xff09; 华为\荣耀设置-路由器拨号情况下 如图设置就行 中兴设置-路由器拨号情况下 中兴路由器有两个设置地方也是如图设置 …

浅析Android View绘制过程中的Surface

前言 在《浅析Android中View的测量布局流程》中我们对VSYNC信号到达App进程之后开启的View布局过程进行了分析&#xff0c;经过对整个App界面的View树进行遍历完成了测量和布局&#xff0c;确定了View的大小以及在屏幕中所处的位置。但是&#xff0c;如果想让用户在屏幕上看到…

免费送源码:Java+ssm+Springboot Springboot小型仪器公司生产管理系统 计算机毕业设计原创定制

摘 要 本论文主要论述了如何使用java语言开发一个Springboot小型仪器公司生产管理系统&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述小型仪器公司生产管理系统…

Java学习Day56:暴打舔狗!(SpringBoot)

1.springboot简介 核心能力&#xff1a;Spring容器、日志、自动配置AutoCongfiguration、Starters web应用的能力&#xff1a;MVC、嵌入式Web服务器 数据访问(持久化)&#xff1a;关系型数据库、非关系型数据库 强大的整合其他技术的能力 只要是Java中牛逼的技术&#xff0c…