【问题标题】:Where and when QModelIndex createdQModelIndex 创建的地点和时间
【发布时间】:2020-12-04 00:01:15
【问题描述】:

QAbstractItemModel 类有一个方法 QAbstractItemModel::createIndex() 可以创建 QModelIndex。

这个对象是什么时候为每个 QComboBox 项目创建的?

在文档中我们可以找到:

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

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

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

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

【问题讨论】:

    标签: qt5 qcombobox qabstractitemmodel qmodelindex


    【解决方案1】:

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

    例如,您可以使用我在 github 上的项目:

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

    灯泡状态更新时

    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() 传递给模型。

    所以它自己根据模型返回的行数和列数创建索引。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-30
      • 1970-01-01
      • 1970-01-01
      • 2012-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多