Qml 如何让一个模型方法像'ListView'那样获取(索引)`

Qml 如何让一个模型方法像'ListView'那样获取(索引)`,qml,qt5,qtquick2,Qml,Qt5,Qtquick2,在QML中,当我们有一个ListModel时,这个模型有一个方法:get(index),它返回一个对象,每个角色有一个属性,以角色名命名。这个对象的好处是,这些属性的更改会传播回模型 现在我有了一个QSortFilterProxyModel,它可以注册为QML类型,只需稍作修改,即可支持字符串作为角色标识符,而不是数字 问题是:我不知道如何编写类似于ListModel.get(index)的方法。到目前为止,我只迭代了我的角色,并将数据(索引,角色)填充到QMap(结果是QML中的JS对象) 我

在QML中,当我们有一个
ListModel
时,这个模型有一个方法:
get(index)
,它返回一个对象,每个角色有一个属性,以角色名命名。这个对象的好处是,这些属性的更改会传播回模型

现在我有了一个
QSortFilterProxyModel
,它可以注册为QML类型,只需稍作修改,即可支持
字符串作为角色标识符,而不是数字
问题是:我不知道如何编写类似于
ListModel.get(index)
的方法。到目前为止,我只迭代了我的角色,并将
数据(索引,角色)
填充到
QMap
(结果是QML中的JS对象)

我只在运行时知道
roleName
,所以我不能为每个
roleName
使用带有
Q\u属性的硬编码类。我认为,
ListView
使用了一些的后代,称之为,但我只找到了一段提到它的
Qt4
-“文档”

我想为我的
QSortFilterProxyModel
和其他模型提供一个类似的构造。到目前为止,我通过将调用
get(index)
转发到
get(sourceIndex(index))
来避免这个问题,但这只在
sourceModel
ListModel
时起作用,因此它不是理想的解决方案

因此,问题是:

  • 如何使用
    QAbstractDynamicMetaObject
    使
    get(index)
    -函数类似于QML
    ListModel

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

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

改变模型数据的另一个选择是去一个类似C++的GET/SET方法。


例如,采用索引和变量映射的
set
方法。

您可能对我的库感兴趣:。它有一个
get(index)
方法,但不幸的是它没有将修改传播回模型。我已经知道你的
SortFilterProxyModel
,但是你和我有相同的
get
-函数,因此它不能解决我的问题。它确实不能解决问题,但是如果你没有意识到它,它可能会对你有帮助。这一特点一直在我的雷达上,我需要花一些时间来分析它。或者你可以做公关;)事实上,您的解决方案有一些很好的特性,我认为分析您的代码将教会我很多!我希望在某个时候有人能找到一个解决方案来解决
get
-函数我已经有了相当于
ListModel
setProperty(index,property,value)
,但是随着我从多个
ListModel
移动到几个然后通过
SortFilterProxyModel
访问的函数,而且可以通过完全定制的模型来替换
ListModel
s,不必将所有
get(index.propertyName=newValue
替换为
setProperty(index,propertyName,newValue)
,尽管它只是。。。小问题。如果我找到了一个简单的解决方案,我会编写一个像
QMLifyProxyModel
这样的包装器,为所有QabstracteModels提供一个方便的QML接口。因此,具有动态属性的选项不起作用?我到目前为止还没有设法让它起作用,但我不能说它不起作用,因为它不起作用,或者是因为我的愚蠢。一旦我设法让它与您的解决方案一起工作,我将接受您的答案。它似乎不起作用:在test.cpp:
QObject*test::test(){QObject*m=new QObject(this);m->setProperty(“test1”,QVariant(5));printf(m->property(“test1”).toByteArray();return m;
;在Ma.qML:<代码>测试{组件:OnEndo:控制台。日志(JSON.StRigInIDETION(TestOrth.),TestTo).Test1)/Cuth>只显示了<代码> ObjtNeX< /Cord>但没有属性>代码> TEST1。C++中有所需属性。