背景
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;