3

我想在TextField加载 QML 文件时启用焦点。但是,它不起作用。加载 TestUi.qml 文件后,我放了一些按钮及其onClick()方法_recipientView.focus = true_,它工作正常。问题是第一次加载视图时未启用默认焦点。

测试Ui.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"
    
    }
}

main.qml

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

TestUi {
    id: test
    visible: false
}
4

1 回答 1

8

编辑

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
    }
}

原始答案

这仅仅是因为您正在TestUi使用rootStackView.push(test). 当您这样做时,焦点将被重置。这通常用 a 来处理QFocusScope,它的作用是记住焦点Item,并在重新获得焦点时将焦点交还给它QFocusScope

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

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

Page {
    id: firstPage
    visible: false
    onFocusChanged: {
        scope.focus = true
    }
    FocusScope {
        id: scope
        TextField {
            focus: true
            // ...
        }
    }
}

onVisibleChanged然后,如果您想在用户返回到它时(例如在弹出之后)重置为焦点,则可以使用页面处理程序,而不是记住焦点所在的位置。但在那种情况下,这FocusScope可能是矫枉过正。

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

它也有点不相关,但更喜欢import可用的 QtQuick 组件的最新版本。QtQuick 版本将是 Qt 5.12 的 2.12。对于QtQtcuik.Controls version来说,这有点不那么琐碎,但它们与该版本控制方案保持一致。

于 2017-02-17T13:56:58.427 回答