Как ввести данные в элемент QT, показанный с помощью загрузчика - PullRequest
0 голосов
/ 05 декабря 2018

В моем приложении у меня есть глобальная система, которая управляет навигацией между "экранами".В 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"
}

Текущий результат - красный прямоугольник, а желаемый результат - зеленый.Дело в том, что на главном экране нужно указать, какой цвет должен использовать загруженный экран.

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Для этого вы также можете использовать Component (если вы используете его при реагировании на событие)

Component {
    id: myScreenComponent
    MyScreen {
        anchors.fill: parent
    }
}

function showMyScreen() {
    myScreenComponent.createObject(this, {"color: "green"});
}

В качестве альтернативы, учитывая ваш первый код, я бырекомендуем использовать StackView.push метод , похоже, похож на ваш appNavigation.show.Вы можете указать ему URL, некоторые свойства и тип перехода (который вы можете настроить).

0 голосов
/ 05 декабря 2018

Вы должны использовать свойство item загрузчика, чтобы загрузить объект:

Loader {
    id: loader
    anchors.fill: parent; anchors.margins: 20
    source: "MyScreen.qml"
    onLoaded: loader.item.color = "green"
}
...