Qt 模型视图编程之 ItemDataRole

背景

Qt 中的模型视图架构是用来实现大量数据的存储、处理及其显示的,主要原理是将数据的存储与显示分离:模型定义了标准接口对数据进行访问;视图通过标准接口获取数据并定义显示方式;模型使用信号与槽机制通知视图数据变化。

QModelIndex 是实现数据的表示与数据的获取相分离的关键机制,模型中的数据约定使用唯一的索引来访问。

ItemDataRole

使用 QModelIndex 可以方便地构建出复杂的数据结构、如矩阵、树等。QModelIndex 索引的“数据”本质上是一个对象,而对象则可以拥有多个参数来描述。

在这里插入图片描述

如上图所示,在表格中每个单元格即为一个数据项,在视图中显示时需要能获取每一个特定的参数来确保数据显示符合预期效果,因此每个数据项的参数也需要有一个唯一的索引。

项角色 ItemDataRole 即为数据项参数的索引,在获取数据项的数据时必须指定项角色。

项角色的使用

①.概念

Qt::ItemDataRole 是一个枚举类型,为数据项在不同情况下的数据进行标记。

②.常用数据项

Qt::DisplayRole:用于数据显示

Qt::EditRole:用于数据编辑

Qt::DecorationRole:用于图标显示

Qt::CheckStadeRole:用于可选设置

③.使用项角色设置数据

QModelIndex indexA = model->index(0,0,QModelIndex());
indexA->setData("123",Qt::DisplayRole)  ;

④.使用项角色获取数据

QModelIndex indexA = model->index(0,0,QModelIndex());
qDebug() << model->data(indexA,Qt::DisplayRole).toString();

⑤.自定义项角色

枚举值 Qt::UserRole 可以用来指定自定义的数据类型,给数据项增加额外的数据。

QModelIndex indexA = model->index(0,0,QModelIndex());
indexA->setData("1",Qt::UserRole )  ; 
indexA->setData("2",Qt::UserRole +1)  ;

其他控件中的应用

①.概念

在 Qt 的其他控件中也可以使用 Qt::UserRole 来给项目增加额外的数据。

②.添加基本数据类型

可以通过 Qt::UserRole 给条目添加多条自定义数据:

QTableWidgetItem* item = ui.tableWidget->item(0, 0);
  if (item == nullptr) {
    item = new QTableWidgetItem();
    ui.tableWidget->setItem(0, 0, item);
  }

  item->setData(Qt::EditRole, "张三");
  item->setData(Qt::UserRole+1, 18);
  item->setData(Qt::UserRole + 2, "男");

  qDebug() << item->data(Qt::EditRole).toString() << item->data(Qt::UserRole + 1).toInt() << item->data(Qt::UserRole + 2).toString();

在这里插入图片描述

③.添加自定义数据类型

setData 方法添加的数据本质上是 QVariant 类型,因此也可以用来添加自定义类型的数据。

struct student
{
  QString name;
  int age;
  QString sex;
};
Q_DECLARE_METATYPE(student)


student s;
s.age = 18;
s.name = "张三";
s.sex = "男";

item->setText(s.name);
item->setData(Qt::UserRole, QVariant::fromValue(s));
  
auto st = item->data(Qt::UserRole).value<student>();
qDebug() << st.name << s.age << s.sex;

在这里插入图片描述

在这里插入图片描述

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值