简短
是否可以创建一个readonly property var
绑定到ListModel
的ListElement
值中的数据?
(或者有一些等效的路由以获取包含此数据的结构化readonly
对象,而无需写入readonly property ListModel
的get(...)
函数吗?)
背景/全文
我正在使用qml
中的数据模型代码。该安装的项目大量使用pragma Singleton
前端/QtObject
后端模式,其中前端中的数据为readonly
,后端通过Loader
W/source
有条件地加载,该后端通过switch
分配的位置以及在哪里,以及合作伙伴运行时项目改用function
调用来订购后端以更改数据(必要时)。这样做是为了协助混淆后端是从硬件中读取的真实数据,还是使用运行时代码嘲笑合作伙伴项目设置的数据。另一个上行是可以在运行时动态切换到软件模型的能力。
基本模式是:
somefeaturefrontend.qml
pragma Singleton
import QtQuick 2.0
QtObject {
id: someFeatureFrontEnd
readonly property string _backend: "fake"
readonly property double fraction: _backend.item.fraction
readonly property int counter: _backend.item.counter
//... etc ...
function setFraction(value) { _backend.item.setFraction(value) }
function incrementCounter() { _backend.item.incrementCounter() }
function decrementCounter() { _backend.item.decrementCounter() }
//... etc ...
_backend: Loader {
id: _backend
source: {
switch(backend) {
case "fake":
default:
return "backends/SomeFeatureBackendFake.qml"
}
}
}
}
后端/somefeaturebackendapi.qml
import QtQuick 2.0
//This is just an interface for the derived backend children
// not actually instantiation.
QtObject {
property double fraction
property int counter
//... etc ...
function setFraction(value) { }
function incrementCounter() { }
function decrementCounter() { }
//... etc ...
}
后端/somefeaturebackendfake.qml
import QtQuick 2.0
SomeFeatureBackendApi {
fraction: 1.0
counter: 0
//... etc ...
function setFraction(value) { fraction = value }
function incrementCounter() { counter++ }
function decrementCounter() { counter-- }
//... etc ...
}
现在,在这种一般策略中,我遇到了一种困境,因为我想以与上面的counter
和fraction
相同的方式添加一些动态分配的结构化数据。看似直观的拟合方式似乎是ListModel
,因为它支持结构化的,可修改的数据。
有关ListModel的一些详细信息:
- 整数索引。
-
ListElement
数据是所有基本类型real
/double
,或者如果更方便,则是一个示例:
thinglist.qml
import QtQuick 2.0
ListModel {
//Initializer code to dynamically initialize w/ an
//arbitrary number of ThingEntry instances...
}
ThingEntry.qml
import QtQuick 2.0
ListElement {
property double profileValue
property int profileScore
}
让我知道您是否对上面的混淆代码片段有任何疑问。
现在根据摘要来回顾问题/困境,以与我的后端/前端模式使用此ListModel
:
根据我的理解,readonly property ListModel structuredStuff
仍然可以通过structuredStuff.get()
调用来修改,对吗?我不想要那个...由于上述原因,我希望前端上的任何内容是readonly
。
我如何根据后端的非阅读property ListModel
在前端中方便地获得 var
的readonly
表示?
我已经基于qml开发了一个问题的框架。基本问题是列表模型必须包含直接数据,但不包含对象,在我的框架中,ListModel可以包含任何QT对象,即支持数据绑定,即ListModel数据可以绑定到其他QT数据/var。