QModelIndex 创建的时间和地点

Where and when QModelIndex created

Class QAbstractItemModel 有一个创建 QModelIndex 的方法 QAbstractItemModel::createIndex()

例如,何时为每个 QComboBox 项目创建此对象?

在文档中我们可以找到:

注意:模型索引应立即使用,然后丢弃。在调用更改模型结构或删除项目的模型函数后,您不应依赖索引保持有效。如果您需要随时间保留模型索引,请使用 QPersistentModelIndex。

看起来是临时对象,但是谁创建的?它是模型,但我没有发现任何迹象表明模型本身在源代码中创建索引,或者视图(Widget)在从模型读取数据之前创建索引?

QComboBox 如何存储从 Model 中读取的值和索引,或者它在每次需要更新数据时从中读取?

QComboBox实际上是如何读取数据的,它只是从0循环到rowCount()并为每个值创建新索引然后使用data( const QModelIndex &index, int role )读取吗?

好的,在我用模型编写了自己的小部件之后,我有了一个答案——由小部件本身创建的 QModelIndex。

例如,您可以在 github:

上使用我的项目

https://github.com/vasiliyaltunin/articles.blog.altuninvv.ru/tree/master/qt5/Models/LampModel

lamp 状态更新时

https://github.com/vasiliyaltunin/articles.blog.altuninvv.ru/blob/1068fdd88466b0e2dcf818af1e305e7d41896b19/qt5/Models/LampModel/qlampwidget.cpp#L344

我使用模型方法 data() 从模型中获取状态

this->setStatus(model->data(QModelIndex(),Qt::DisplayRole).toInt());

因为我在模型中只有一个“单元格”,所以我将空的 QModelIndex() 传递给模型。

所以它的小部件本身根据模型返回的行数和列数创建索引。