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

QML StackView替代StackLayout后USB键盘输入无响应的焦点问题

问题分析与解决方案

核心问题是StackView切换到Login页面时,焦点未正确传递到内部的TextInput组件,导致USB键盘输入无响应。直接给StackView的currentItem(Login.qml的根Rectangle)调用forceActiveFocus()无效,因为Rectangle本身不处理文本输入焦点,焦点必须落到它内部的TextInput上。

具体修正步骤

1. 修正StackView的replace调用参数

你的replace方法第二个参数传入错误,正确的第二个参数应为传递给目标页面的属性映射(可传空对象)。修改main.qml中的replace代码:

layout.replace(Qt.resolvedUrl("Login.qml"), {}, StackView.Immediate)

2. 让TextInput获取焦点的两种有效方式

方式一:在Login页面内部自动获取焦点

给Login.qml的TextInput添加id,并在组件加载完成后强制获取焦点:

Rectangle{
    id: logbox
    color: "#EFEBE9"
    radius: 2
    width: 225
    height: 30
    border.color: "black"
    x:300
    y:220
    property string placeholderText: "   "

    TextInput {
        id: inputField // 添加id标识
        width: 225
        height: 30
        text: logbox.placeholderText
        signal qmlSignal(string msg)

        onAccepted: {
            console.log("msg="+text)
            fileStuff.save(text);
        }

        Component.onCompleted: {
            inputField.forceActiveFocus() // 组件加载完成后强制获取焦点
        }
    }
}

方式二:在StackView层面控制焦点传递

修改main.qml的currentItemChanged逻辑,直接定位到Login页面内的TextInput并设置焦点:

onCurrentItemChanged: {
    if (currentItem ) {
        console.log(layout.currentItem)
        // 检查当前页面是否包含目标TextInput组件
        if (currentItem.inputField) {
            currentItem.inputField.forceActiveFocus()
        }
        console.log(layout.activeFocus)
    }
}

需配合给Login.qml的TextInput添加id: inputField。

补充说明

  • StackView的currentItem是页面根组件(此处为Rectangle),它不具备文本输入能力,必须将焦点传递到内部的TextInput组件才会响应键盘输入。
  • 仅设置focus: true可能因StackView页面切换的时序问题无法生效,显式调用forceActiveFocus()能确保焦点正确设置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 16:33:29