Qt 实战(10)模型视图 | 10.3、模型数据索引
文章目录
- 一、模型数据索引
- 1、什么是模型数据索引?
- 2、模型
- 3、获取`QModelndex`
- 3.1、获取列表数据项索引
- 3.2、获取表格数据项索引
- 3.3、获取树数据项索引
- 4、模型数据更新
前言:
在Qt框架中,模型/视图(Model/View)架构是一种强大的机制,它允许开发者将数据的存储(Model)与数据的展示(View)分离。这种架构不仅提高了代码的可维护性,还增强了应用程序的灵活性。在模型/视图架构中,模型数据索引(Model Data Index)是一个核心概念,它用于在不依赖底层数据结构的情况下,高效地访问和操作数据。
一、模型数据索引
1、什么是模型数据索引?
模型数据索引,在Qt中通常通过
QModelIndex
类表示,是访问模型中数据项的一种方式。每个QModelIndex
对象都包含了对特定数据项的临时引用,这个引用包含了行号、列号以及父项的索引信息。通过这种方式,视图(View)和委托(Delegate)能够请求并显示模型(Model)中的数据,而无需关心数据在底层的具体存储方式。
2、模型
在模型视图结构中,模型提供了一个标准接口,代理与视图可以通过标准接口访问模型数据。标准接口是由
QAbstractItemModel
定义的,无论数据项存储在任何底层数据结构中,都可以通过标准接口访问数据项。Qt中常见的3种模型,如下:
3、获取QModelndex
根据 行号、列号和父项的
QModelndex
可以获取数据项对应的QModelndex
,进而对数据进行操作,方法如下:
QModelIndex QAbstractItemModel::index(int row, int column, const QModelIndex &parent = QModelIndex()) const
3.1、获取列表数据项索引
对于列表,只需要知道行号就可以获取索引,如下:
QModelIndex idx = model->index(0, 0);//列号传入0即可
3.2、获取表格数据项索引
表格可以理解成一个二维的数组,根据行、列号可以获取对应的索引,如下:
QModelIndex idx = model->index(1, 2);//获取第2行第3列的数据,索引号都从0开始
3.3、获取树数据项索引
树是在表格的基础上加上了层级结构,所以需要传入父节点的
QModelIndex
才可以获取索引,如下:
// 如果是顶层节点传入空的父节点索引即可
QModelIndex indexA = model->index(0, 0, QModelIndex()); // A 索引
QModelIndex indexC = model->index(2, 1, QModelIndex()); // C 索引
QModelIndex indexB = model->index(1, 0, indexA); // B 索引
4、模型数据更新
通过索引可以获取、编辑模型中的数据,接口如下:
// 获取模型数据
virtual QVariant QAbstractItemModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const = 0
// 修改模型数据
virtual bool QAbstractItemModel::setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole)