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)
该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版本,它的琐碎性要小一些,但是它们与该版本控制方案保持一致。
| 归档时间: |
|
| 查看次数: |
1399 次 |
| 最近记录: |