Как связать Readonly VAR с данными ListModel в QML?

краткое

Можно ли создать readonly property var привязаны к данным внутри ListElement значения ListModel?

(Или есть какой-то эквивалентный маршрут, чтобы получить структурированный readonly объект, содержащий эти данные без записи записи readonly property ListModel"s get(...) работать?)


Фон / Полная версия

Я работаю с кодом модели данных в qml, Этот установленный проект интенсивно использует pragma Singleton внешний интерфейс / QtObject фоновый шаблон, в котором данные во внешнем интерфейсе readonlyбэкэнд условно загружается через Loader ж / 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 по причинам, рассмотренным выше.

Как мне удобно и качественно получить readonly представление это var- как во внешнем интерфейсе, основанный на property ListModel в бэкэнде?

1 ответ

Я разработал основу для этой проблемы на основе qml. основная проблема в том, что listmodel должен содержать прямые данные, но не объект, в моей структуре listmodel может содержать любой объект qt, который поддерживает привязку данных, т.е. данные listmodel могут связываться с другими данными qt /var.

Другие вопросы по тегам