如何将读取的var绑定到QML中列表模型的数据



简短

是否可以创建一个readonly property var绑定到ListModelListElement值中的数据?

(或者有一些等效的路由以获取包含此数据的结构化readonly对象,而无需写入readonly property ListModelget(...)函数吗?)


背景/全文

我正在使用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 ...
}

现在,在这种一般策略中,我遇到了一种困境,因为我想以与上面的counterfraction相同的方式添加一些动态分配的结构化数据。看似直观的拟合方式似乎是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在前端中方便地获得 varreadonly表示?

我已经基于qml开发了一个问题的框架。基本问题是列表模型必须包含直接数据,但不包含对象,在我的框架中,ListModel可以包含任何QT对象,即支持数据绑定,即ListModel数据可以绑定到其他QT数据/var。

最新更新