Qt QML Фокус элемента (TextField) при показе страницы StackView

Вопрос: Я хочу включить фокус TextField при загрузке qml файла. Но это не работает. После загрузки файла TestUi.qml я положил некоторую кнопку и ее метод onClick, я сделал recipientView.focus = true, он отлично работает. Проблема в том, что фокус по умолчанию не включен, когда просмотр загружается в первый раз. TestUi.qml import QtQuick 2.0 import QtQuick.Controls

Вопрос:

Я хочу включить фокус TextField при загрузке qml файла. Но это не работает. После загрузки файла TestUi.qml я положил некоторую кнопку и ее метод onClick, я сделал recipientView.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» } }

main.qml

onComposeBtnClicked: { rootStackView.push(test) test.init() } TestUi { id: test visible: false } Лучший ответ:

Это просто потому, что вы TestUi в свой стек с помощью rootStackView.push(test). Когда вы это сделаете, фокус сбрасывается. Обычно это обрабатывается с помощью QFocusScope, роль которого заключается в том, чтобы помнить сфокусированный элемент и возвращать ему фокус, когда QFocusScope восстанавливает фокус.

В вашем случае добавление QFocusScope на вашу базовую страницу позволит правильно восстановить фокус при отображении страницы:

StackView { id: stackView initialItem: firstPage onCurrentItemChanged: { currentItem.forceActiveFocus() } } Page { id: firstPage onFocusChanged: { scope.focus = true } FocusScope { id: scope TextField { focus: true // … } } }

Затем вы можете использовать обработчик страницы onVisibleChanged если вы хотите сбросить фокус, когда пользователь вернется к нему (после поп, например), вместо того, чтобы запомнить его там, где находится фокус. Но в этом случае FocusScope может быть излишним.

Для получения информации вы можете также использовать свойство initialItem, чтобы установить первую страницу.

Оцените статью
Добавить комментарий