В моем приложении у меня есть глобальная система, которая управляет навигацией между "экранами".В QML я могу просто вызвать что-то вроде:
appNavigation.show("MyScreen.qml", NavigationType.FADE)
, это вызывает часть кода C ++, которая обрабатывает текущий стек экранов и использует сигналы, чтобы сообщить QML для выполнения реальной анимации.В конце в QML некоторые Loader
загрузят входной qml (в данном случае «MyScreen.qml») и покажут его так, как определено.
Моя проблема здесь заключается в том, как вставить данные во вновь загруженный экран.По сути, я хотел бы сделать что-то вроде следующего:
function showMyScreen() {
MyScreen screen = appNavigation.show("MyScreen.qml", NavigationType.FADE)
screen.someData = "some data here"
}
но возможно ли это?Могу ли я как-нибудь вернуть экран, который загружен загрузчиком?
Наверное, нет, поэтому я бы удовлетворился отправкой данных с помощью самой навигации, например:
function showMyScreen() {
MyScreen screen = appNavigation.show("MyScreen.qml", NavigationType.FADE, "some data here")
}
Я мог бы переслатьданные до точки, где я устанавливаю источник для загрузчика, но все же, что тогда?Как или где этот конкретный экран, который будет загружен, получит данные.Чтобы уменьшить это, вот что я получаю:
function setNewItemWithData(newItem, data) {
loader.source = newItem
loader.concreteScreen.data = data // Not really doable
}
снова я предполагаю, что это невозможно, и мне нужно переслать данные в загрузчик и использовать событие onLoaded
.Так что я бы сделал что-то вроде:
onLoaded: {
myLoadedScreen.data = data
}
Я предполагаю, что что-то подобное возможно, но как?Что мне здесь не хватает, как мне получить myLoadedScreen
и как получить доступ к его свойствам?
В настоящее время я занимаюсь тем, что выгружаю данные в часть C ++ и затем собираю их в загруженном QML.Вот как:
appNavigation.injectedData = "some data here"
, а затем в только что загруженном элементе:
property data = appNavigation.injectedData
Это работает, но это выглядит как очень плохое кодирование.Любая из альтернатив будет полезна.
Спасибо за ваше терпение.
Поскольку был сделан запрос на MCVE:
Это общая проблема, и я ожидаю, что она будет иметь несколькорешения.Я бы с нетерпением ждал любого из них.Однако минимальный пример для этого - создание нового проекта и добавление загрузчика с другим qml, для которого необходимо изменить какое-либо свойство:
main:
import QtQuick 2.9
import QtQuick.Window 2.2
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
Loader {
anchors.fill: parent; anchors.margins: 20
source: "MyScreen.qml"
// TODO: make screen green (loadedScreen.color = "green")
}
}
MyScreen:
import QtQuick 2.0
Rectangle {
color: "red"
}
Текущий результат - красный прямоугольник, а желаемый результат - зеленый.Дело в том, что на главном экране нужно указать, какой цвет должен использовать загруженный экран.