如何拥有一个模型方法get(index),如'ListView'之一



在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))来规避问题,但这只有在sourceModelListModel的情况下才有效,因此这不是理想的解决方案。

所以问题是:

  • 如何使用QAbstractDynamicMetaObject来获得类似于 QMLListModelget(index)函数

我认为在运行时构建元对象需要私有API,即QMetaObjectBuilder.

您可以尝试QML是否也可以访问QObject的动态属性。 创建一个QObject实例并使用QObject::setProperty()设置值,而不是将它们添加到变体映射中。

更改模型数据的另一种选择是像C++一样采用获取/设置方法。 例如,采用索引和变体映射的set方法。

相关内容

最新更新