QML对话与焦点textField

时间:2014-12-02 18:04:43

标签: dialog focus qml textfield qt-quick

我正在研究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

之后,某种程度上焦点会发生变化

2 个答案:

答案 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()
}