Qt 模型视图编程之 ItemDataRole
创始人
2024-03-29 09:03:44
0

背景

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();
qDebug() << st.name << s.age << s.sex;

在这里插入图片描述

在这里插入图片描述

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【Ctfer训练计划】——(三... 作者名:Demo不是emo  主页面链接:主页传送门 创作初心ÿ...