You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

不同QML文件的对象实例间如何发送信号?StackView页面传值实现

方案1:使用StackView原生传参(推荐,适配你的场景)

StackView的push()方法原生支持第二个参数,用于给新入栈的页面传递初始化属性,不需要额外定义全局状态或信号连接,是当前场景下改动最小的实现方式。

步骤1:修改Screen2,定义接收参数的属性

给Screen2新增属性用于接收传递过来的文本,直接绑定到显示控件:

// Screen2.qml
Item {
    id: screen_2
    width: 480
    height: 600
    // 新增别名属性,直接绑定到Text控件的text属性,传值后自动更新显示
    property alias showText: txt_rect.text

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

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

步骤2:修改Screen1的跳转逻辑,传参入栈

首先纠正你代码里的拼写错误:TextField的onEditingFinished事件你写成了onEditingFinsihed,会导致输入完成事件无法触发。
修改按钮的点击逻辑,跳转时把输入的文本传递给Screen2:

// Screen1.qml
Item {
    id: screen_1
    width: 480
    height: 600

    TextField {
        id: user_input
        width: parent.width
        height: parent.height - 100
        anchors.horizontalCenter: parent.horizontalCenter
        placeholderText: qsTr("Enter your name")
        // 已修正拼写错误,不需要额外定义input属性存储值,直接读取user_input.text即可
        onEditingFinished: {}
    }

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

        onClicked: {
            console.log("Moving to Screen2")
            // 用StackView附加属性获取当前所属的StackView实例,push时携带参数
            StackView.view.push("qrc:/Screen2.qml", {
                showText: user_input.text
            })
        } 
    }
}

到这里就可以实现你要的效果了,Screen1输入的内容会直接显示在Screen2的文本控件上。


方案2:全局单例状态管理(适合复杂跨页面共享场景)

如果你的场景需要多页面共享数据、跳转后还要双向同步更新,可以用QML单例来做全局状态管理:

  1. 新建GlobalStore.qml,声明为单例:
// GlobalStore.qml
pragma Singleton
import QtQuick 2.15

QtObject {
    // 定义全局共享的文本属性
    property string sharedInputText: ""
}
  1. 同目录下新增qmldir文件,注册单例:
singleton GlobalStore 1.0 GlobalStore.qml
  1. Screen1跳转时给全局属性赋值:
onClicked: {
    GlobalStore.sharedInputText = user_input.text
    StackView.view.push("qrc:/Screen2.qml")
}
  1. Screen2的文本控件直接绑定全局属性:
Text {
    id: txt_rect
    anchors.centerIn: parent
    text: GlobalStore.sharedInputText
}

这种方案适合多步跳转、多个页面都需要访问同一个数据的场景,维护更方便。


内容的提问来源于stack exchange,提问作者Mohammad Ali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 07:42:02