当前位置: 首页 > article >正文

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控件作为编辑器

    在这里插入图片描述


http://www.kler.cn/a/374001.html

相关文章:

  • 【设计模式】如何用C++实现依赖倒置
  • SSRF-pikachu
  • 蓝桥杯普及题
  • Efficient Cascaded Multiscale Adaptive Network for Image Restoration 论文阅读笔记
  • k8s部署redis远程连接示例
  • 基于SpringBoot的在线医疗问答平台
  • 音视频入门基础:FLV专题(21)——FFmpeg源码中,获取FLV文件音频信息的实现(上)
  • 组件封装思路
  • JDBC——获取DBMS连接、优化与工具类封装
  • 深入 Prometheus 监控生态 - 第六篇:与 Grafana 实现系统全面监控(健康状态和任务状态看板)
  • 邮件发送excel带预览excel功能
  • Rust线程构建安全并发应用
  • rocksDB手动安装
  • Vue 组件开发:深入理解与实践
  • Knowledge-refined Denoising Network for Robust Recommendation
  • BFS解决拓扑排序(3)_火星词典
  • 机器学习-期末考核-深度学习
  • 【jvm】如何设置新生代和老年代的比例
  • 【笔记】数据结构与算法
  • Golang | Leetcode Golang题解之第514题自由之路
  • pip使用
  • 2024年华为OD机试真题---字符串重新排序
  • PETG耗材3d打印技巧
  • 15分钟学 Go 第 21 天:标准库使用
  • Elasticsearch开源仓库404 7万多star一夜清零
  • 数据结构-选择排序笔记