在不同 QML 文件中的两个对象实例之间发送信号

Send a signal between two object instances in different QML files

我试图将信号从一个 QML 文件中的一个对象发送到另一个 QML 文件中的另一个对象,但似乎找不到任何好的资源作为指南。我遇到的大多数示例都显示信号和槽用于在同一 QML 文件(即同一组件内)中实现的两个对象之间进行通信,或者在第三个 QML 文件中组合在一起的两个不同组件文件中进行通信,这与我的用例不同。

我需要将 string 值从 QML 文件中的一个对象(代表一个屏幕)发送到另一个 QML 文件中的另一个对象(代表另一个屏幕)。当前链接屏幕的方式是通过 main.qml 文件中的 StackView QML 类型。

我见过的最接近描述的相同问题是 。在我的例子中,接受的答案的问题是对象 Rect1Rect2 后来在同一个文件中定义。这意味着可以给它们一个 id 并且信号和插槽可以连接在一起,这是我无法做到的。

下面是一些演示问题的代码。

main.qml:

ApplicationWindow {
    id: app_container
    width: 480
    height: 600
    visible: true

    StackView {
        id: screen_stack
        anchors.fill: parent
  
        initialItem: Screen1 {
        }
    }
}

Screen1:

Item {
    id: screen_1
    width: 480
    height: 600

    property var input

    TextField {
        id: user_input
        width: parent.width
        height: parent.height - 100
        anchors.horizontalCenter: parent.horizontalCenter
        placeholderText: qsTr("Enter your name")

        onEditingFinsihed: {
            input = user_input.text
        }
    }

    Button {
        width: parent.width
        height: 100
        anchors.top: user_input.bottom
        anchors.horizontalCenter: parent.horizontalCenter

        onClicked: {
            console.log("Moving to Screen2")
            screen_stack.push("qrc:/Screen2.qml")
        } 
    }
}

Screen2:

Item {
    id: screen_2
    width: 480
    height: 600

    Rectangle {
        anchors.fill: parent
        color: "yellow"

        Text {
            id: txt_rect
            anchors.horizontalCenter: parent.horizontalCenter
            anchors.verticalCenter: parent.verticalCenter
            text: qsTr("")
        }
    }
}

我希望能够将用户输入从 Screen1 中的 TextField user_input 发送到 Screen2 中的文本 txt_rect。我怎样才能做到这一点?

您可以推送属性:

screen_stack.push("qrc:/Screen2.qml", {"inputText": user_input.text})

屏幕 2:

Item {
id: screen_2
width: 480
height: 600

property var inputText

Rectangle {
    anchors.fill: parent
    color: "yellow"

    Text {
        id: txt_rect
        anchors.horizontalCenter: parent.horizontalCenter
        anchors.verticalCenter: parent.verticalCenter
        text: screen_2.inputText
    }
}
}