Как связать 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.