在我的应用程序中,我有一个全局系统来处理“屏幕”之间的导航。在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的加载器,并应将一些属性更改为该加载器:
主要:
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")
}
}
我的屏幕:
import QtQuick 2.0
Rectangle {
color: "red"
}
当前结果是看到一个红色矩形,而期望结果是看到一个绿色矩形。关键是主屏幕需要告诉加载的屏幕需要使用哪种颜色。
答案 0 :(得分:2)
您必须使用Loader的item属性来加载对象:
Loader {
id: loader
anchors.fill: parent; anchors.margins: 20
source: "MyScreen.qml"
onLoaded: loader.item.color = "green"
}
答案 1 :(得分:1)
为此,您最好使用Component
(如果在对事件做出反应时使用它)
Component {
id: myScreenComponent
MyScreen {
anchors.fill: parent
}
}
function showMyScreen() {
myScreenComponent.createObject(this, {"color: "green"});
}
或者,给定您的第一个代码,我建议您使用StackView
。
push
method似乎与您的appNavigation.show
类似。
您可以为其提供一个url,一些属性和一个过渡类型(可以自定义)。