Qt QML在显示StackView页面时聚焦项目(文本字段)

nAk*_*dov 2 qt focus qml stackview

我想在加载qml文件时启用TextField焦点。但是,它不起作用。加载TestUi.qml文件后,我放了一些按钮,并使用了onClick方法(我做了receiveView.focus = true),效果很好。问题在于,首次加载视图时未启用默认焦点。

TestUi.qml

import QtQuick 2.0
import QtQuick.Controls 2.1
import QtQuick.Layouts 1.0


Page {

    function init() {
        recipientView.focus = true;
    }

    TextField {
       id: recipientView
        Layout.fillWidth: true
        font.pixelSize: 18
        inputMethodHints: Qt.ImhNoPredictiveText | Qt.ImhEmailCharactersOnly
        focus: true
        placeholderText: "Email"

    }
}
Run Code Online (Sandbox Code Playgroud)

main.qml

onComposeBtnClicked: {
    rootStackView.push(test)
    test.init()
}

TestUi {
    id: test
    visible: false
}
Run Code Online (Sandbox Code Playgroud)

Adr*_*vat 5

编辑

Page组件已经充当FocusScope,因此仅需要强制激活焦点。感谢您的评论。

StackView {
    id: stackView
    initialItem: firstPage

    // Ensures the focus changes to your page whenever
    // you show a different page
    onCurrentItemChanged: {
        currentItem.forceActiveFocus()
    }
}

Page {
    id: firstPage
    visible: false

    TextField {
        // Explicitly set the focus where needed
        focus: true
    }
}
Run Code Online (Sandbox Code Playgroud)

原始答案

这仅仅是因为您正在使用推TestUi入堆栈rootStackView.push(test)。这样做时,将重设焦点。通常使用来处理QFocusScope此任务,该角色的作用是记住焦点Item,并在QFocusScope重新获得焦点时将焦点返回给焦点。

在您的情况下,QFocusScope在基础页面上添加a 将可以在显示该页面时正确地恢复焦点:

StackView {
    id: stackView
    initialItem: firstPage
    onCurrentItemChanged: {
        currentItem.forceActiveFocus()
    }
}

Page {
    id: firstPage
    visible: false
    onFocusChanged: {
        scope.focus = true
    }
    FocusScope {
        id: scope
        TextField {
            focus: true
            // ...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,onVisibleChanged如果您想在用户返回到焦点(例如弹出窗口后)时将其重置为焦点,则可以使用页面处理程序,而不是将焦点存储在焦点所在的位置。但是在那种情况下,这FocusScope可能是过大了。

有关信息,您也可以使用该StackView属性initialItem来设置第一页。

它也是无关的,但是更喜欢import使用最新版本的QtQuick组件。对于Qt 5.12,QtQuick版本将为2.12。对于QtQtcuik.Controls版本,它的琐碎性要小一些,但是它们与该版本控制方案保持一致。