在QML中,当我们有一个ListModel
时,这个模型有一个方法:get(index)
它返回一个对象,每个角色都有一个属性,以角色名称命名。这个对象的好处是,这些属性的更改被传播回模型。
现在我有一个QSortFilterProxyModel
,它可以 - 只需稍作更改以支持strings
作为角色标识符,而不是数字 - 注册为 QML 类型。
问题:我不知道如何编写类似于ListModel.get(index)
的方法。到目前为止,我只迭代了我的角色,并将data(index, role)
塞进了一个QMap<QString, QVariant>
(在 QML 中产生了一个 JS 对象)。
我只在
运行时知道roleNames
,所以我不能对每个roleName
使用带有Q_PROPERTY
的硬编码类。我认为ListView
使用了QAbstractDynamicMetaObject
的一些后代,为此称为ModelNodeMetaObject
,但我只找到了一条旧Qt4
-"文档"提到了它。
我想为我的QSortFilterProxyModel
和其他可能的模型提供一个类似的结构。到目前为止,我通过将呼叫get(index)
转发给get(sourceIndex(index))
来规避问题,但这只有在sourceModel
是ListModel
的情况下才有效,因此这不是理想的解决方案。
所以问题是:
- 如何使用
QAbstractDynamicMetaObject
来获得类似于 QMLListModel
的get(index)
函数
我认为在运行时构建元对象需要私有API,即QMetaObjectBuilder
.
您可以尝试QML是否也可以访问QObject
的动态属性。 创建一个QObject
实例并使用QObject::setProperty()
设置值,而不是将它们添加到变体映射中。
更改模型数据的另一种选择是像C++一样采用获取/设置方法。 例如,采用索引和变体映射的set
方法。