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