我正在研究qt快速应用程序,我想打开对话框。在这个对话框窗口中是TextField,我想在对话框打开后将焦点设置到这个textfiel。 这段代码可以解决问题。
function newFolder() {
newFolderDialog.visible = true
newFolderDialog.open()
}
Dialog {
id: newFolderDialog
title: "New folder"
height: 150
width: 300
standardButtons: StandardButton.Ok | StandardButton.Cancel
Column {
anchors.fill: parent
Text {
text: "Name"
height: 40
}
TextField {
id: newFolderInput
width: parent.width * 0.75
focus: true
onFocusChanged: console.log("Focus changed " + focus)
}
}
onVisibilityChanged: {
if(visible === true){
newFolderInput.text = ""
newFolderInput.focus = true
}
}
}
输出到控制台是
qml:焦点改变了假 qml:焦点改变了真实 qml:焦点改变了错误
看起来,在我将焦点设置为textField
之后,某种程度上焦点会发生变化答案 0 :(得分:6)
您不需要写入的功能。来自Dialog
的文档,用于函数open()
:
显示用户的对话框。 相当于将可见设置为true。
鉴于(它不是问题),似乎焦点在对话框和包含的元素之间不断争用。打开/关闭Dialog
越多,评估就越多。我现在无法弄清楚为什么会这样。但是,您可以通过以下方法轻松解决问题:(1)删除onVisibilityChanged
处理程序和(2)重写newFolder()
。最终代码被重写:
ApplicationWindow {
width: 360
height: 300
visible: true
Button {
anchors.centerIn: parent
text: "click me!"
onClicked: newFolder()
}
Dialog {
id: newFolderDialog
title: "New folder"
height: 150
width: 300
standardButtons: StandardButton.Ok | StandardButton.Cancel
focus: true // Needed in 5.9+ or this code is NOT going to work!!
Column {
anchors.fill: parent
Text {
text: "Name"
height: 40
}
TextField {
id: newFolderInput
width: parent.width * 0.75
focus: true
onFocusChanged: console.log("Focus changed " + focus)
}
}
}
function newFolder() {
newFolderDialog.open()
newFolderInput.focus = true
}
}
这样您首先打开对话框,然后将焦点设置为正确的Item
。
答案 1 :(得分:0)
打开对话框后,我不得不使用forceActiveFocus()方法
onClicked: {
dialog.open()
input.forceActiveFocus()
}