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

Qt的委托代理机制

  • 委托是Qt中的一种机制,用于在Qt模型/视图架构中处理特定类型的数据。委托提供了一种方便的方法来定制特定类型的数据的显示和编辑。
  • 委托可以做以下事情:

编辑特定类型的数据: 通过创建编辑器来编辑特定类型的数据,例如日期,数值等。
渲染特定类型的数据: 通过定制单元格的外观来渲染特定类型的数据,例如颜色,字体等;
支持不同类型的编辑器: 支持不同类型的编辑器,例如文本编辑器,下拉列表编辑器等;
处理编辑器的事件: 通过实现eventFilter()方法来处理编辑器的事件,如键盘事件;
更新编辑器的尺寸: 通过实现sizeHint()方法来更新编辑器的尺寸;
数据验证: 通过实现editorEvent()来验证编辑器中的数据是否合法。

  • 委托的常见应用场景包括:

表格和列表视图: 在表格和列表视图中使用委托可以方便地编辑单元格中的数据,并定制单元格的外观
属性编辑器: 使用委托可以创建自定义属性编辑器来编辑特定类型的属性
文件对话框: 使用委托可以定制文件对话框中的文件列表的外观

以QTableView为例子:

  1. 需要为QTableView设置一个model
  • 也可以自定义model,继承QStandardItemModel;
  1. 为QTableView设置Delegate
  • 继承QStandardItemModel、QItemDelegate或者QStyledItemDelegate;
  • QItemDelegate是QAbstractItemDelegate的子类,它提供了一种通用的委托类;
  • QStyledItemDelegate是QItemDelegate的子类,它使用Qt Style Sheets来渲染单元格中的数据,这样可以更好地与应用程序的外观保持一致。它还提供了一些额外的功能,如支持自定义编辑器和支持编辑器工厂,这样可以更好地管理编辑器;
  1. 委托类需要重写对应的函数,比如:
  1. QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,const QModelIndex &index) const;
  2. void setEditorData(QWidget *editor, const QModelIndex &index) const;
  3. void setModelData(QWidget *editor, QAbstractItemModel *model,const QModelIndex &index) const;
  4. void updateEditorGeometry(QWidget *editor,const QStyleOptionViewItem &option, const QModelIndex &index) const;
  5. void paint(QPainter *painter, const QStyleOptionViewItem &option,const QModelIndex & index) const;
  6. QSize sizeHint(const QStyleOptionViewItem &option,const QModelIndex &index) const;
  7. bool eventFilter(QObject *object, QEvent *event) ;
  8. bool editorEvent(QEvent *event, QAbstractItemModel *model,
    const QStyleOptionViewItem &option, const QModelIndex &index) override;

创建编辑器

QWidget* TableViewDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{QSpinBox *sbox = new QSpinBox(parent);sbox->setRange(sboxMinValue, sboxMaxValue);sbox->setSuffix(sboxSuffixStr);sbox->setPrefix(sboxPrefixStr);sbox->setSingleStep(sboxSingleStep);sbox->setStepType(sboxStepType);sbox->setValue(sboxInitValue);return  sbox;
}

设置编辑器数据 setEditorData

void TableViewDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{auto value = index.model()->data(index, Qt::EditRole);QSpinBox *spinBox = static_cast<QSpinBox*>(editor);spinBox->setValue(value.toInt());
}

设置模型数据 setModelData

void TableViewDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index)const
{QSpinBox *spinBox = static_cast<QSpinBox*>(editor);QVariant value = spinBox->value();model->setData(index, value, Qt::EditRole);}

更新编辑器集合属性 updateEditorGeometry

void TableViewDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index)const
{editor->setGeometry(option.rect);
}

部分代码如下:

#include <QStyledItemDelegate>
#include <QItemDelegate>
#include <QStandardItemModel>
/*
*
*
*	创建一个QSpinBox设置相关参数函数
*
*
*/
class TableViewDelegate  : public QStyledItemDelegate
{Q_OBJECTpublic:TableViewDelegate(QObject *parent = nullptr);~TableViewDelegate();// editingQWidget *createEditor(QWidget *parent,const QStyleOptionViewItem &option,const QModelIndex &index)const;void setEditorData(QWidget *editor, const QModelIndex &index) const ;void setModelData(QWidget *editor,QAbstractItemModel *model,const QModelIndex &index)const;void updateEditorGeometry(QWidget *editor,const QStyleOptionViewItem &option,const QModelIndex &index)const;
private:void init();
public:/*QSpinBox设置相关参数函数*/void setSboxMaxValue(const int max);void setSboxMinValue(const int min);void setSboxPrefixStr(const QString &prefix);void setSboxSuffixStr(const QString &suffix);void setSboxSingleStep(const int SingleStep);void setSboxInitValue(const int initValue);void setSboxStepType(QAbstractSpinBox::StepType st);
private:/*QSpinBox相关参数*/int sboxMaxValue;/*微调框的最大值*/int sboxMinValue;/*微调框的最小值*/QString sboxPrefixStr;/*微调框前缀*/QString sboxSuffixStr;/*微调框后缀*/int sboxSingleStep;/*微调框步长*/int sboxInitValue;/*微调框初始值*/QAbstractSpinBox::StepType sboxStepType;/*微调框步长类型*/
};Delegate.cpp
TableViewDelegate::TableViewDelegate(QObject *parent): QStyledItemDelegate(parent)
{
}
TableViewDelegate::~TableViewDelegate()
{
}
QWidget* TableViewDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{QSpinBox *sbox = new QSpinBox(parent);sbox->setRange(sboxMinValue, sboxMaxValue);sbox->setSuffix(sboxSuffixStr);sbox->setPrefix(sboxPrefixStr);sbox->setSingleStep(sboxSingleStep);sbox->setStepType(sboxStepType);sbox->setValue(sboxInitValue);return  sbox;
}//将模型中的数据赋值给编辑器
void TableViewDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{auto value = index.model()->data(index, Qt::EditRole);QSpinBox *spinBox = static_cast<QSpinBox*>(editor);spinBox->setValue(value.toInt());
}
void TableViewDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index)const
{QSpinBox *spinBox = static_cast<QSpinBox*>(editor);QVariant value = spinBox->value();model->setData(index, value, Qt::EditRole);
}
void TableViewDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index)const
{editor->setGeometry(option.rect);
}
/*QSpinBox设置相关参数函数*/
void TableViewDelegate::setSboxMaxValue(const int max)
{sboxMaxValue = max;
}
void TableViewDelegate::setSboxMinValue(const int min)
{sboxMinValue = min;
}
void TableViewDelegate::setSboxPrefixStr(const QString &prefix) 
{sboxPrefixStr = prefix;
}
void TableViewDelegate::setSboxSuffixStr(const QString &suffix)
{sboxSuffixStr = suffix;
}
void TableViewDelegate::setSboxSingleStep(const int SingleStep)
{sboxSingleStep = SingleStep;
}
void TableViewDelegate::setSboxInitValue(const int initValue)
{sboxInitValue = initValue;
}
void TableViewDelegate::setSboxStepType(QAbstractSpinBox::StepType st)
{sboxStepType = st;
}
void TableViewDelegate::init()
{
}
//在QTableView中使用
void init() 
{QStringList columnNames;columnNames << "QSpinBox" << "QComboBox" << "QCheckBox" << ".....";model = new QStandardItemModel;model->setRowCount(10);model->setHorizontalHeaderLabels(columnNames);ui->tableView->setModel(model);TableViewDelegate * tabDelegate = new TableViewDelegate;tabDelegate->setSboxMinValue(0);tabDelegate->setSboxMaxValue(100);tabDelegate->setSboxSingleStep(2);tabDelegate->setSboxInitValue(10);//设置第一列为TableViewDelegate 样式ui->tableView->setItemDelegateForColumn(0, tabDelegate);
}
http://www.lryc.cn/news/233596.html

相关文章:

  • OpenCV入门5——OpenCV的算术与位运算
  • 好用的开源项目地址
  • 深度学习(五)softmax 回归之:分类算法介绍,如何加载 Fashion-MINIST 数据集
  • 单稳态中间继电器\UEG/A-2H/220V 8A导轨安装 JOSEF约瑟
  • 2311rust到20版本更新
  • 基于Spring、SpringMVC、MyBatis的漫画网站
  • MySQL数据库八股文
  • 利用WebSocket +MQ发送紧急订单消息,并在客户端收到消息的用户的页面自动刷新列表
  • R语言——taxize(第一部分)
  • 【Spring Cloud】黑马头条 用户服务创建、登录功能实现
  • 聚观早报 |英伟达发布H200;夸克发布自研大模型
  • 15项基本SCADA技术技能
  • Golang 发送邮件
  • 【ARM Trace32(劳特巴赫) 使用介绍 5-- Trace32 通过 JTAG 命令获取数据寄存器 IDCODE的值】
  • Python之while/for,continue/break
  • 卷积神经网络(CNN)衣服图像分类的实现
  • odoo16前端框架源码阅读——env.js
  • 浙大恩特客户资源管理系统 SQL注入漏洞复现
  • ESP32网络开发实例-BME280传感器数据保存到InfluxDB时序数据库
  • C++中sort()函数的greater<int>()参数
  • 2024有哪些免费的mac苹果电脑内存清理工具?
  • 线性表的概念
  • 锐捷练习-ospf虚链路及rip路由相互引入
  • 【机器学习】线性回归算法:原理、公式推导、损失函数、似然函数、梯度下降
  • Word中NoteExpress不显示的问题
  • 连接池的大体介绍,常用配置及在springboot项目中的应用
  • Java之SpringCloud Alibaba【九】【Spring Cloud微服务Skywalking】
  • wpf devexpress设置行和编辑器
  • AdaBoost 算法:理解、实现和掌握 AdaBoost
  • 基于ssm+vue设备配件检修管理系统