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

QML StackView多页面切换异常:二级页面信号未触发

问题原因

你当前的代码逻辑存在核心错误:在StackView里预先定义的Second_screen实例(id=search_screen),和你通过stack_view.push("./Second_screen.qml")创建的页面不是同一个对象。push文件路径会生成一个全新的Second_screen实例,而你在main.qml里绑定的onSearchRegister信号是属于预先定义的那个未被使用的实例,自然不会触发。

修复方案

有两种可行的修复方式,选其一即可:

方案一:直接push预先定义的实例对象

修改main.qml里的push逻辑,不要用文件路径,而是直接传入你已经定义好的实例id:

// main.qml 中Login_dark的onLoggedIn信号处理
Login_dark {
    id: loginWin
    onLoggedIn: {
        console.log(stack_view)
        // 替换原路径为实例id
        stack_view.push(search_screen)
    }
}

同时,Test_interface_dark的跳转也同理,确保push的是预先定义的实例,而不是文件路径。

方案二:push时动态绑定信号

如果不想预先定义所有页面实例,可以在push文件路径的同时,直接绑定信号处理逻辑:

// main.qml 中Login_dark的onLoggedIn信号处理
Login_dark {
    id: loginWin
    onLoggedIn: {
        console.log(stack_view)
        stack_view.push({
            source: "./Second_screen.qml",
            // 直接在这里绑定信号
            onSearchRegister: {
                console.log('Test signal Invoked')
                stack_view.push(test_screen)
            }
        })
    }
}

这种方式不需要在StackView里预先定义Second_screen实例,更灵活。

额外注意事项
  • 确保Second_screen.qml里正确定义了searchRegister信号,比如:
// Second_screen.qml
Item {
    id: second_item
    anchors.fill: parent

    // 必须正确声明信号
    signal searchRegister()

    Button {
        onClicked: {
            // 触发信号
            second_item.searchRegister()
        }
    }
}
  • 不要随意修改stack_view.initialItem,这个属性是设置栈的初始页面,跳转时用push/pop即可,修改它会导致栈逻辑混乱。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 01:09:30