QML:转到下一个控件的形式

时间:2014-07-08 05:39:19

标签: qt qml qtquick2

如何在QML表格中将焦点从一个控件移动到下一个控件? 默认情况下,它适用于Tab按钮,但我需要将其更改为Enter。 所有控件都以Gridlayout订购,有2列。

4 个答案:

答案 0 :(得分:9)

我已经定义了一个新组件TextFieldMoveOnReturn.qml

import QtQuick 2.0
import QtQuick.Controls 1.1

TextField {
    Keys.onReturnPressed:  nextItemInFocusChain().forceActiveFocus()
}

如果您使用此文件而不是TextField,则会获得所需的行为

编辑更好的解决方案:定义一个新组件GridLayoutNextOnReturn.qml

import QtQuick 2.0
import QtQuick.Layouts 1.1

GridLayout {
    Keys.onReturnPressed: {
        for (var i = 0; i < children.length; ++i)
            if (children[i].focus) {
                children[i].nextItemInFocusChain().forceActiveFocus()
                break
            }
    }
}

并在里面使用普通的TextField - 就像魅力一样

答案 1 :(得分:1)

您可以使用onEditingFinished

import QtQuick 2.2
import QtQuick.Controls 1.2
import QtQuick.Layouts 1.1

Rectangle {
    width: 400
    height: 400

    GridLayout {
        anchors.fill: parent
        columns: 2

        Label {
            text: "Name"
        }
        TextField {
            onEditingFinished: addressEdit.focus = true
        }
        Label {
            text: "Address"
        }
        TextField {
            id: addressEdit
        }
    }
}

答案 2 :(得分:0)

使用Keys.onReturnPressedforceActiveFocus()

import QtQuick 2.2
import QtQuick.Controls 1.2
import QtQuick.Layouts 1.1

Rectangle {
    width: 400
    height: 400

    GridLayout {
        anchors.fill: parent
        columns: 2

        Label {
            text: "Name"
        }
        TextField {
            Keys.onReturnPressed: organizationEdit.forceActiveFocus()
        }
        Label {
            text: "Organization"
        }
        TextField {
            id: organizationEdit
            Keys.onReturnPressed: addressEdit.forceActiveFocus()
        }
        Label {
            text: "Address"
        }
        TextField {
            id: addressEdit
        }
    }
}

答案 3 :(得分:0)

为了使其更加健壮和灵活,您应该做出相同的行为 TabEnter/Return键。
处理keyPressed事件,并使用KeyNavigation.tab而不是nextItemInFocusChain来集中关注下一个元素,如下所示:

import QtQuick 2.12
import QtQuick.Controls 1.12

Column {
    TextField {
        id: field1
        KeyNavigation.tab: field2
        activeFocusOnTab: true
        Keys.onReturnPressed: KeyNavigation.tab.forceActiveFocus();
    }
    TextField {
        id: field2
        KeyNavigation.tab: field3
        activeFocusOnTab: true
        Keys.onReturnPressed: KeyNavigation.tab.forceActiveFocus();
    }
    TextField {
        id: field3
        KeyNavigation.tab: field1
        activeFocusOnTab: true
        Keys.onReturnPressed: KeyNavigation.tab.forceActiveFocus();
    }
}

因此,您可以控制焦点顺序,并且用户可以交替使用tabreturn键,从而产生 更好的UX
每当您要 更改订单 时,只需更改KeyNavigation.tab值:)

注意:我极力建议您避免使用nextItemInFocusChain,因为将来会有所变化并具有灵活性