QML - 如何知道孩子是否有键盘焦点

HWe*_*nde 2 qt focus qml

我想我知道如何使用FocusScopes以及如何处理键盘焦点.

但我找不到一个聪明的方法来弄清楚我的一件儿童用品或他们或我下面的人是否有键盘焦点.

FocusScope的文档说:

当焦点范围接收到活动焦点时,包含焦点的所包含元素(如果有)也会获得活动焦点.如果此元素也是FocusScope,则代理行为将继续.焦点范围和子焦点项都将具有activeFocus属性集.

因此, 当焦点被放置到包含的FocusScope时,FocusScope 将activeFocus设置为false.有没有办法弄清楚是否是这种情况?我怎么知道至少一个包含的FocusScope是否得到了关注?

The*_*roo 5

焦点是QtQuick的一个链条.这意味着所有的祖先FocusScope下降到当前活跃的孩子获得主动焦点.

FocusScope用于制作更简单的焦点抽象:告诉自定义组件,当根对象获得活动焦点时,它必须将其转发给给定的子节点.

在以下示例中:

import QtQuick 2.0;

Rectangle {
    width: 400;
    height: 200;
    focus: true;

    FocusScope {
        id: scope1;
        anchors {
            top: parent.top;
            left: parent.left;
            right: parent.right;
            bottom: parent.verticalCenter;
        }

        Rectangle {
            id: rect1;
            color: (scope1.activeFocus ? "yellow" : "gray");
            border.width: 1;
            anchors.fill: parent;

            MouseArea {
                anchors.fill: parent;
                onClicked: { scope1.forceActiveFocus (); }
            }
            TextInput {
                id: input1;
                focus: true;
                anchors.centerIn: parent;
            }
        }
    }
    FocusScope {
        id: scope2;
        anchors {
            top: parent.verticalCenter;
            left: parent.left;
            right: parent.right;
            bottom: parent.bottom;
        }

        Rectangle {
            id: rect2;
            color: (scope2.activeFocus ? "yellow" : "gray");
            border.width: 1;
            anchors.fill: parent;

            MouseArea {
                anchors.fill: parent;
                onClicked: { scope2.forceActiveFocus (); }
            }
            TextInput {
                id: input2;
                focus: true;
                anchors.centerIn: parent;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

...我们想要两个可以有焦点的大区域,我们不需要明确地关注内部TextInput(因为它们理想地会在自定义组件内部,因此无法从外部访问).

因此,当一个区域被点击时,我们将主动焦点放在父范围内,并且范围自动将它代理到具有焦点的孩子:true标志(意味着它想要焦点,而不是它有它,这就是为什么我们每个TextInput都有一个标志.

如果内部输入具有活动焦点,则需要知道的项目将简单地请求范围是否具有它.他们没有在意的是在里面.

如果范围包含另一个具有焦点的范围:true,则会再次转发焦点,直到它到达需要焦点的最新项目.