QModelIndex与QAbstractItemModel一同定义,用以索引模型(model)中的项(Item)。
由于所有模型都是以“行“、”列”、“层级”结构组织的,我们可以使用统一的方式索引模型中的项。
所有模型都使用QModelIndex作为模型的索引。
QModelIndex内部包含了行信息、列信息与指向所属模型的指针,因此理论上可以做很多事。
文档原文: https://doc.qt.io/qt-5/qmodelindex.html
详细信息
这个类可以用作QAbstractModel以及从它所派生的模型的索引。“视图”(view)、“代理”(delegate)和“选择模型”(selection models)都使用索引来定位模型中的项。
QModelIndex 的默认构造函数只能创建无效索引,有效的QModelIndex对象应由模型使用QAbstractItemModel::createIndex 函数创建。模型中的最高级项的父索引是无效索引。
QModelIndex 不止一个构造函数,但是除了无参数的构造函数外,其他的构造函数(能创造出有效索引的构造函数)都被设置为私有。
QAbstractItemModel 是 QModelIndex 的友元,它可以访问这些私有构造函数来创建出有效的索引。
所有模型都是 QAbstractItemModel 的子类(或间接子类),它们继承了QAbstractItemModel的createIndex函数。
QModelIndex可以用来引用模型中的项,它包含确定这个项在模型中的位置所需的所有信息。索引拥有行信息、列信息,并且可能拥有父索引,可以使用row()、column()和parent()函数来获取这些信息。模型中的每个顶级项都由一个没有父索引的模型索引表示,在这种情况下,parent()将返回一个无效的模型索引,这种情况相当于使用QModelIndex()来构造无效索引。
(Qt5.15)
QModelIndex 拥有这些私有变量:
int r, c;
quintptr i;
const QAbstractItemModel *m;
其中 r 与 c 是行列信息,m 是其所属的模型的指针。i 是用来把索引和底层数据结构联系起来的 void 指针。
QModelIndex 没有指向其父索引的指针,QModelIndex 的 parent 函数是通过调用其对应模型的 parent 函数实现的。
QModelIndex有internalPointer()函数,可以存任何数据
QModelIndex
的 internalPointer
是一个用于存储自定义数据的指针。通常,你可以使用它来关联模型索引与模型以外的数据。
以下是如何设置和获取 internalPointer
的示例代码:
// 设置 internalPointer
QModelIndex index = ...; // 获取某个模型索引
MyCustomData *data = new MyCustomData(); // 假设有一个自定义数据类型
index.internalPointer = data;
// 获取 internalPointer
MyCustomData *retrievedData = static_cast<MyCustomData*>(index.internalPointer);
booleanmodel.h
class BooleanModel : public QAbstractItemModel
{
public:
BooleanModel(QObject *parent = 0);
~BooleanModel();
void setRootNode(Node *node);
QModelIndex index( int row, int column,
const QModelIndex &parent) const;
QModelIndex parent( const QModelIndex &child) const;
int rowCount( const QModelIndex &parent) const;
int columnCount( const QModelIndex &parent) const;
QVariant data( const QModelIndex &index, int role) const;
QVariant headerData( int section, Qt::Orientation orientation,
int role) const;
private:
Node *nodeFromIndex( const QModelIndex &index) const;
Node *rootNode;
};
booleanmodel.cpp
Node *BooleanModel::nodeFromIndex( const QModelIndex &index) const
{
if (index.isValid()) {
return static_cast<Node *>(index.internalPointer());
} else {
return rootNode;
}
}
要获取模型中某个项的索引,请调用QAbstractIemModel::index(),这个函数需要三个参数:行数、列数、父索引的引用。引用模型中的顶级项时,应提供无效索引作为父索引。
QAbstractIemModel::index()是一个纯虚函数,各个模型有不同的实现。
接口:
QModelIndex QAbstractItemModel::index(int row, int column, const QModelIndex &parent = QModelIndex()) const
第三个参数已经默认是无效索引,因此创建顶级项索引时传一个无效索引进去其实是多此一举。
model() 函数的作用是:返回索引对应模型的指针(const QAbstractItemModel*)。
child() 函数的作用是:获取该索引的子项目。
sibling() 函数的作用是:遍历模型中与本索引同级别的项。
注意:应立即使用模型索引,然后丢弃。在调用更改模型结构或删除项的模型函数后,不应认为索引仍然有效。如果需要长时间保留模型索引,请使用QPersistentModelIndex。
另请参见模型/视图编程、QPersistentModelIndex和QAbstractItemModel。
成员函数
QModelIndex::QModelIndex()
创建无效模型索引,用以指示模型中的某位置无效。
另请参见isValid()和QAbstractItemModel。
int QModelIndex::column()const
返回索引所引用的元素所在的列数。
QVariant QModelIndex::data(int role=Qt::DisplayRole)const
给定角色(role),返回索引引用的项的数据。
Qt::ItemFlags QModelIndex::flags() const
返回索引引用的项的标志(flag)。
此函数在Qt 4.2中引入。
quintptr QModelIndex::internalId() const
返回将索引与内部数据结构关联的quintptr,这个quintptr被模型所使用。
另请参见QAbstractItemModel::createIndex()。
void* QModelIndex::internalPointer() const
返回将索引与内部数据结构关联的void*指针,这个指针被模型所使用。
另请参见QAbstractItemModel::createIndex()。
bool QModelIndex::isValid()const
如果此模型索引有效,则返回true;否则返回false。
有效索引属于模型,并且具有非负的行号和列号。
另请参见model()、row()和column()。
如果模型索引内部那个指向模型的指针非空,而且行列数非负,那么这个索引有效。
const QAbstractItemModel* QModelIndex::model()const
返回指向此索引对应模型的指针。
返回值是常量指针,因为调用模型的非常量函数可能会使模型索引无效,并可能使应用程序崩溃。
QModelIndex QModelIndex::parent()const
返回模型索引的父索引,如果没有父索引,则返回QModelIndex()。
int QModelIndex::row()const
返回索引所引用的元素所在的列数。
QModelIndex QModelIndex::sibling(int row,int column)const
返回该索引的兄弟。如果此位置没有兄弟,则返回无效的QModelIndex。
另请参见 parent(), siblingAtColumn(), 和 siblingAtRow()。
QModelIndex QModelIndex::siblingAtColumn(int column)const
返回该索引的当前列的兄弟。如果此位置没有兄弟,则返回无效QModelIndex。
此函数在Qt 5.11中引入。
另请参见sibling() and siblingAtRow()。
QModelIndex QModelIndex::siblingAtRow(int row) const
返回该索引的当前行的兄弟。如果此位置没有兄弟,则返回无效QModelIndex。
此函数在Qt 5.11中引入。
另请参见sibling() and siblingAtColumn()。
bool QModelIndex::operator=(const QModelIndex &other)const
如果此模型索引与其他模型索引引用的位置不同,则返回true;否则返回false。
bool QModelIndex::operator<(const QModelIndex &other)const
如果此模型索引小于其他模型索引,则返回true;否则返回false。
小于计算对开发人员没有直接的帮助,没有定义具有不同父级的索引进行比较的方式。此运算符的存在只是为了使该类可以与QMap一起使用。
Qt 4.1中引入了此函数。
bool QModelIndex::operator==(const QModelIndex& other)const
如果此模型索引引用的位置与其他模型索引相同,则返回true;否则返回false。
与其他模型索引进行比较时,将使用内部数据指针、行、列和模型值。