如何将数据注入到加载程序显示的QT项目中

时间:2018-12-05 07:36:37

标签: qt qml qt5

在我的应用程序中,我有一个全局系统来处理“屏幕”之间的导航。在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"
}

当前结果是看到一个红色矩形,而期望结果是看到一个绿色矩形。关键是主屏幕需要告诉加载的屏幕需要使用哪种颜色。

2 个答案:

答案 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"});
}

或者,给定您的第一个代码,我建议您使用StackViewpush method似乎与您的appNavigation.show类似。 您可以为其提供一个url,一些属性和一个过渡类型(可以自定义)。