模型索引(QModelIndex)

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。

另请参见模型/视图编程QPersistentModelIndexQAbstractItemModel。

成员函数

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()。

另请参见 sibling() 和 model()。

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。

与其他模型索引进行比较时,将使用内部数据指针、行、列和模型值。

  • 15
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高亚奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值