TableDelegate 自定义代理组件的主要作用是对原有表格进行调整,例如默认情况下Table中的缺省代理就是一个编辑框,我们只能够在编辑框内输入数据,而有时我们想选择数据而不是输入,此时就需要重写编辑框实现选择的效果,代理组件常用于个性化定制Table表格中的字段类型。

在自定义代理中QAbstractItemDelegate是所有代理类的抽象基类,我们继承任何组件时都必须要包括如下4个函数:

  • CreateEditor() 用于创建编辑模型数据的组件,例如(QSpinBox组件)
  • SetEditorData() 从数据模型获取数据,以供Widget组件进行编辑
  • SetModelData() 将Widget组件上的数据更新到数据模型
  • UpdateEditorGeometry() 给Widget组件设置一个合适的大小

此处我们分别重写三个代理接口,其中两个ComBox组件用于选择婚否,SpinBox组件用于调节数值范围,先来定义三个重写部件。

重写接口spindelegate.cpp代码如下.

  1. #include "spindelegate.h"
  2. #include <QSpinBox>
  3. QWIntSpinDelegate::QWIntSpinDelegate(QObject *parent):QStyledItemDelegate(parent)
  4. {
  5. }
  6. // https://www.cnblogs.com/lyshark
  7. QWidget *QWIntSpinDelegate::createEditor(QWidget *parent,const QStyleOptionViewItem &option, const QModelIndex &index) const
  8. {
  9. //创建代理编辑组件
  10. Q_UNUSED(option);
  11. Q_UNUSED(index);
  12. QSpinBox *editor = new QSpinBox(parent); //创建一个QSpinBox
  13. editor->setFrame(false); //设置为无边框
  14. editor->setMinimum(0);
  15. editor->setMaximum(10000);
  16. return editor; //返回此编辑器
  17. }
  18. void QWIntSpinDelegate::setEditorData(QWidget *editor,const QModelIndex &index) const
  19. {
  20. //从数据模型获取数据,显示到代理组件中
  21. //获取数据模型的模型索引指向的单元的数据
  22. int value = index.model()->data(index, Qt::EditRole).toInt();
  23. QSpinBox *spinBox = static_cast<QSpinBox*>(editor); //强制类型转换
  24. spinBox->setValue(value); //设置编辑器的数值
  25. }
  26. void QWIntSpinDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
  27. {
  28. //将代理组件的数据,保存到数据模型中
  29. QSpinBox *spinBox = static_cast<QSpinBox*>(editor); //强制类型转换
  30. spinBox->interpretText(); //解释数据,如果数据被修改后,就触发信号
  31. int value = spinBox->value(); //获取spinBox的值
  32. model->setData(index, value, Qt::EditRole); //更新到数据模型
  33. }
  34. void QWIntSpinDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
  35. {
  36. //设置组件大小
  37. Q_UNUSED(index);
  38. editor->setGeometry(option.rect);
  39. }

重写接口floatspindelegate.cpp代码如下.

  1. #include "floatspindelegate.h"
  2. #include <QDoubleSpinBox>
  3. QWFloatSpinDelegate::QWFloatSpinDelegate(QObject *parent):QStyledItemDelegate(parent)
  4. {
  5. }
  6. QWidget *QWFloatSpinDelegate::createEditor(QWidget *parent,
  7. const QStyleOptionViewItem &option, const QModelIndex &index) const
  8. {
  9. Q_UNUSED(option);
  10. Q_UNUSED(index);
  11. QDoubleSpinBox *editor = new QDoubleSpinBox(parent);
  12. editor->setFrame(false);
  13. editor->setMinimum(0);
  14. editor->setDecimals(2);
  15. editor->setMaximum(10000);
  16. return editor;
  17. }
  18. void QWFloatSpinDelegate::setEditorData(QWidget *editor,
  19. const QModelIndex &index) const
  20. {
  21. float value = index.model()->data(index, Qt::EditRole).toFloat();
  22. QDoubleSpinBox *spinBox = static_cast<QDoubleSpinBox*>(editor);
  23. spinBox->setValue(value);
  24. }
  25. // https://www.cnblogs.com/lyshark
  26. void QWFloatSpinDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
  27. {
  28. QDoubleSpinBox *spinBox = static_cast<QDoubleSpinBox*>(editor);
  29. spinBox->interpretText();
  30. float value = spinBox->value();
  31. QString str=QString::asprintf("%.2f",value);
  32. model->setData(index, str, Qt::EditRole);
  33. }
  34. void QWFloatSpinDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
  35. {
  36. editor->setGeometry(option.rect);
  37. }

重写接口comboxdelegate.cpp代码如下.

  1. #include "comboxdelegate.h"
  2. #include <QComboBox>
  3. QWComboBoxDelegate::QWComboBoxDelegate(QObject *parent):QItemDelegate(parent)
  4. {
  5. }
  6. QWidget *QWComboBoxDelegate::createEditor(QWidget *parent,const QStyleOptionViewItem &option, const QModelIndex &index) const
  7. {
  8. QComboBox *editor = new QComboBox(parent);
  9. editor->addItem("已婚");
  10. editor->addItem("未婚");
  11. editor->addItem("单身");
  12. return editor;
  13. }
  14. // https://www.cnblogs.com/lyshark
  15. void QWComboBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
  16. {
  17. QString str = index.model()->data(index, Qt::EditRole).toString();
  18. QComboBox *comboBox = static_cast<QComboBox*>(editor);
  19. comboBox->setCurrentText(str);
  20. }
  21. void QWComboBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
  22. {
  23. QComboBox *comboBox = static_cast<QComboBox*>(editor);
  24. QString str = comboBox->currentText();
  25. model->setData(index, str, Qt::EditRole);
  26. }
  27. void QWComboBoxDelegate::updateEditorGeometry(QWidget *editor,const QStyleOptionViewItem &option, const QModelIndex &index) const
  28. {
  29. editor->setGeometry(option.rect);
  30. }

将部件导入到mainwindow.cpp中,并将其通过ui->tableView->setItemDelegateForColumn(0,&intSpinDelegate);关联部件到指定的table下标索引上面。

  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. // https://www.cnblogs.com/lyshark
  4. MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
  5. {
  6. ui->setupUi(this);
  7. // 初始化模型数据
  8. model = new QStandardItemModel(4,6,this); // 初始化4行,每行六列
  9. selection = new QItemSelectionModel(model); // 关联模型
  10. ui->tableView->setModel(model);
  11. ui->tableView->setSelectionModel(selection);
  12. // 添加表头
  13. QStringList HeaderList;
  14. HeaderList << "序号" << "姓名" << "年龄" << "性别" << "婚否" << "薪资";
  15. model->setHorizontalHeaderLabels(HeaderList);
  16. // 批量添加数据
  17. QStringList DataList[3];
  18. QStandardItem *Item;
  19. DataList[0] << "1001" << "admin" << "24" << "男" << "已婚" << "4235.43";
  20. DataList[1] << "1002" << "lyshark" << "23" << "男" << "未婚" << "10000.21";
  21. DataList[2] << "1003" << "lucy" << "37" << "女" << "单身" << "8900.23";
  22. int Array_Length = DataList->length(); // 获取每个数组中元素数
  23. int Array_Count = sizeof(DataList) / sizeof(DataList[0]); // 获取数组个数
  24. for(int x=0; x<Array_Count; x++)
  25. {
  26. for(int y=0; y<Array_Length; y++)
  27. {
  28. // std::cout << DataList[x][y].toStdString().data() << std::endl;
  29. Item = new QStandardItem(DataList[x][y]);
  30. model->setItem(x,y,Item);
  31. }
  32. }
  33. // 为各列设置自定义代理组件
  34. // 0,4,5 代表第几列 后面的函数则是使用哪个代理类的意思
  35. ui->tableView->setItemDelegateForColumn(0,&intSpinDelegate);
  36. ui->tableView->setItemDelegateForColumn(4,&comboBoxDelegate);
  37. ui->tableView->setItemDelegateForColumn(5,&floatSpinDelegate);
  38. }
  39. MainWindow::~MainWindow()
  40. {
  41. delete ui;
  42. }

代理部件关联后,再次运行程序,会发现原来的TableWidget组件中的编辑框已经替换为了选择框等组件:

C/C++ Qt TableDelegate 自定义代理组件的更多相关文章

  1. 第30课 Qt中的文本编辑组件

    1. 3种常用的文本编辑组件的比较 单行文本支持 多行文本支持 自定义格式支持 富文本支持 QLineEdit (单行文本编辑组件) Yes No No No QPlainTextEdit (多行普通 ...

  2. 对jquery的ajax进行二次封装以及ajax缓存代理组件:AjaxCache

    虽然jquery的较新的api已经很好用了, 但是在实际工作还是有做二次封装的必要,好处有:1,二次封装后的API更加简洁,更符合个人的使用习惯:2,可以对ajax操作做一些统一处理,比如追加随机数或 ...

  3. qt qml qchart 图表组件

    qt qml qchart 图表组件 * Author: Julien Wintz * Created: Thu Feb 13 23:41:59 2014 (+0100) 这玩意是从chart.js迁 ...

  4. SSIS自定义数据流组件开发(血路)

    由于特殊的原因(怎么特殊不解释),需要开发自定义数据流组件处理. 查了很多资料,用了不同的版本,发现各种各样的问题没有找到最终的解决方案. 遇到的问题如下: 用VS2015编译出来的插件,在SSDTB ...

  5. Android Studio开发基础之自定义View组件

    一般情况下,不直接使用View和ViewGroup类,而是使用使用其子类.例如要显示一张图片可以用View类的子类ImageView,开发自定义View组件可分为两个主要步骤: 一.创建一个继承自an ...

  6. [UE4]自定义MovementComponent组件

    自定义Movement组件 目的:实现自定义轨迹如抛物线,线性,定点等运动方式,作为组件控制绑定对象的运动. 基类:UMovementComponent 过程: 1.创建UCustomMovement ...

  7. Qt之自定义QLineEdit右键菜单

    一.QLineEdit说明 QLineEdit是单行文本框,不同于QTextEdit,他只能显示一行文本,通常可以用作用户名.密码和搜索框等.它还提供了一些列的信号和槽,方便我们使用,有兴趣的小伙伴可 ...

  8. 客户端使用自定义代理类访问WCF服务 z

    通常在客户端访问WCF服务时,都需要添加服务引用,然后在客户端app.config或 web.config文件中产生WCF服务的客户端配置信息.若是每添加一个服务都是这样做,这样势必会将比较麻烦,能否 ...

  9. Qt之自定义搜索框

    简述 关于搜索框,大家都经常接触.例如:浏览器搜索.Windows资源管理器搜索等. 当然,这些对于Qt实现来说毫无压力,只要思路清晰,分分钟搞定. 方案一:调用QLineEdit现有接口 void ...

随机推荐

  1. Intellij IDEA使用姿势

    Intellij IDEA 智能补全的 10 个姿势,太牛逼了.. Intellij Idea非常6的10个姿势

  2. Java泛型背后是什么?

    文Java中泛型的应用,让大家更好地理解泛型,以及常说的泛型类型擦除是什么概念,举一个简单的例子,如下: 这里可以看出来在代码编写阶段就已经报错了,不能往string类型的集合中添加int类型的数据. ...

  3. SpringCloud-SpringBoot-SpringCloudAlibaba对应版本选择

    一.SpringCloud-SpringBoot 对应的版本选择 SpringCloud官网常规方式只能查看最新的几个版本信息 https://spring.io/projects/spring-cl ...

  4. Kettle的安装及简单使用

    Kettle的安装及简单使用 目录 Kettle的安装及简单使用 一.kettle概述 二.kettle安装部署和使用 Windows下安装 案例1:MySQL to MySQL 案例2:使用作业执行 ...

  5. Coursera Deep Learning笔记 序列模型(三)Sequence models & Attention mechanism(序列模型和注意力机制)

    参考 1. 基础模型(Basic Model) Sequence to sequence模型(Seq2Seq) 从机器翻译到语音识别方面都有着广泛的应用. 举例: 该机器翻译问题,可以使用" ...

  6. .Net2.0连接PG数据注意事项

    .Net2.0连接PG数据注意事项 第一次用.net操作PG[.NET2.0] 一:Npgsql版本问题 1:如果是.net2.0  建议用2.0.11.0[NuGet搜索npgsql第一个的最低版本 ...

  7. 【二食堂】Beta - Scrum Meeting 8

    Scrum Meeting 8 例会时间:5.22 20:00~20:10 进度情况 组员 当前进度 今日任务 李健 1. UI优化已经完成,顺带修复了一点小bug.issue 1. 文本导入.保存部 ...

  8. 第3次 Beta Scrum Meeting

    本次会议为Beta阶段第3次Scrum Meeting会议 会议概要 会议时间:2021年6月2日 会议地点:「腾讯会议」线上进行 会议时长:0.5小时 会议内容简介:对完成工作进行阶段性汇报:对下一 ...

  9. the Agiles Scrum Meeting 2

    会议时间:2020.4.10 21:00 1.每个人的工作 今天已完成的工作 yjy:debug:班级创建了个人项目不能访问班级:教师窗口的前端bug. issues:Bug:教师创建博客时显示项目为 ...

  10. elasticsearch入门(简单的crud操作)

    记录一下,elasticsearch从创建索引到插入数据的一个crud操作. 一.创建索引 curl -XPUT "http://192.168.99.1:9200/productindex ...