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

文章目录

  • 一、代理
    • 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控件作为编辑器

    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

“北斗+实景三维”,助力全域社会治理

在国家治理体系和治理能力现代化的大背景下&#xff0c;全域社会治理成为提升国家治理效能的关键。“北斗实景三维”技术组合&#xff0c;为全域社会治理提供了新的技术支撑和解决方案。本文将探讨这一技术如何助力全域社会治理&#xff0c;以及其在实际应用中的潜力和挑战。 …

mysql8.0.32升级到8.0.40

上篇8.0.32库的准备&#xff1a;mysql: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No suc-CSDN博客 此篇测试升级到8.0.40 MySQL :: Download MySQL Community Server rootjyc:~# mysql -u root -pabcd1234 mysql: [Warning]…

高阶数据结构--图(graph)

图&#xff08;graph&#xff09; 1.并查集1. 并查集原理2. 并查集实现3. 并查集应用 2.图的基本概念3. 图的存储结构3.1 邻接矩阵3.2 邻接矩阵的代码实现3.3 邻接表3.4 邻接表的代码实现 4. 图的遍历4.1 图的广度优先遍历4.2 广度优先遍历的代码 1.并查集 1. 并查集原理 在一…

go 聊天系统项目-1

1、登录界面 说明&#xff1a;这一节的内容采用 go mod 管理【GO111MODULE‘’】的模块&#xff0c;从第二节开始使用【GO111MODULE‘off’】GOPATH 管理模块。具体参见 go 包相关知识 1.1登录界面代码目录结构 代码所在目录/Users/zld/Go-project/day8/chatroom/ 1.2登录…

支持向量机背后的数学奥秘

一、基本概念与原理 1.1 支持向量机的定义 支持向量机是一种二分类模型&#xff0c;其核心思想是在样本空间中寻找一个超平面&#xff0c;将不同类别的样本分开。这个超平面被称为决策边界或分隔超平面。支持向量是距离决策边界最近的点&#xff0c;这些点决定了决策边界的位…

C语言指针和数组相关习题

目录 sizeof和一维int数组sizeof和一维char数组strlen()和一维char数组sizeof和字符串strlen()和字符串指针变量指向字符串字面常量易错点sizeof(a):sizeof是操作符 当心整型提升sizeof和二维数组复习一下相关知识点练习题 一个离谱的错误指针1指针2指针3指针4指针5指针6指针7指…

Centos安装ZooKeeper教程(单机版)

本章教程介绍,如何在Centos7中,安装ZooKeeper 3.9.3版本。 一、什么是ZooKeeper ? Apache ZooKeeper 是一个分布式协调服务,用于大型分布式系统中的管理和协调。它为分布式应用提供了一个高性能的通信框架,简化了开发人员在构建复杂分布式系统的任务。ZooKeeper 能够解决一…

出国工作——常用英语——网站注册

Please set your password for your new Qt Account. Password must be at least 8 characters in length. 请为您的新 Qt 账户设置密码。密码长度必须至少为 8 个字符。 Password Password strength: BadThis is similar to a commonly used password. TIP: Add another wor…

江协科技STM32学习- P25 UART串口协议

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

Servlet 3.0 新特性全解

文章目录 Servlet3.0新特性全解Servlet 3.0 新增特性Servlet3.0的注解Servlet3.0的Web模块支持servlet3.0提供的异步处理提供异步原因实现异步原理配置servlet类成为异步的servlet类具体实现异步监听器改进的ServletAPI(上传文件) Servlet3.0新特性全解 tomcat 7以上的版本都支…

mysql 通过GROUP BY 聚合并且拼接去重另个字段

我的需求&#xff1a; 我想知道同一个手机号出现几次&#xff0c;并且手机号出现在哪些地方。下面是要的效果。 源数据: CREATE TABLE bank (id bigint(20) unsigned NOT NULL AUTO_INCREMENT,user_id int(11) NOT NULL DEFAULT 0,tel varchar(255) COLLATE utf8mb4_unicode_…

新加坡托管服务器VS香港托管服务器:AI时代的选择策略

在人工智能迅速发展的今天&#xff0c;服务器作为数据存储与计算的核心基础设施&#xff0c;其性能、稳定性和地理位置对于用户体验和业务效率至关重要。对于中国用户而言&#xff0c;在选择服务器时&#xff0c;新加坡服务器和香港服务器无疑是两个极具吸引力的选项。两者同属…

Linux的硬盘管理

硬盘有价&#xff0c;数据无价 1. 硬盘的概念 硬盘是一种计算机的存储设备&#xff0c;通常是由一个或者多个磁性盘片组成。硬盘即可以安装在计算机的内部&#xff0c;也可以外接计算机。 保存数据 数据&#xff1a;操作系统&#xff0c;应用程序&#xff0c;文档多媒体文件…

震惊,盖子居然重现CSDN?

盖子奇迹般重回C站 众所周知&#xff0c;盖子上次发布文章是在2024年5月18号&#xff08;感兴趣的可以回去看一下&#xff0c;链接放在下面了&#xff09; 盖子的c小课堂——第二十七讲&#xff1a;背包变形题_恰好装满的01背包-CSDN博客https://blog.csdn.net/m0_73334782/a…

PostgreSQL的学习心得和知识总结(一百五十七)|新的 COPY 选项 LOG_VERBOSITY

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…

【力扣打卡系列】二叉树的最近公共祖先

坚持按题型打卡&刷&梳理力扣算法题系列&#xff0c;语言为go&#xff0c;Day18 二叉树的最近公共祖先 题目描述 解题思路 最近公共祖先分类讨论 当前节点是空节点&#xff08;返回当前节点&#xff09;当前节点是p&#xff08;返回当前节点&#xff09;当前节点是q&am…

Redis常见面试题总结(上)

Redis 基础 什么是 Redis? Redis &#xff08;REmote DIctionary Server&#xff09;是一个基于 C 语言开发的开源 NoSQL 数据库&#xff08;BSD 许可&#xff09;。与传统数据库不同的是&#xff0c;Redis 的数据是保存在内存中的&#xff08;内存数据库&#xff0c;支持持久…

Training-free layout control with cross-attention guidance

https://zhuanlan.zhihu.com/p/666445024https://zhuanlan.zhihu.com/p/666445024 支持两种模式,1.sd文生图;2.绑定了dreambooth和text inversion的图像编辑。 # ------------------ example input ------------------examples &

‌Spring MVC的主要组件有哪些?

前言 SpringMVC的核心组件包括DispatcherServlet、Controller、HandlerMapping、HandlerAdapter、ViewResolver、ModelAndView等&#xff0c;它们协同工作以支持基于MVC架构的Web应用程序开发。这些组件使得开发人员能够以一种声明式和模块化的方式构建Web应用程序&#xff0c…

Python突破浏览器TLS/JA3 指纹

初识指纹遇到一个网站,忽然发现无论如何如何更换UA和代理请求都是403&#xff0c;curl_cffi 可模拟真实浏览器的 TLS | JA3 指纹。 查看 tls 指纹的网站&#xff1a; https://tls.browserleaks.com/json不同网站的生成的指纹可能有差异&#xff0c;但是多次访问同一个网站生成…