繁体   English   中英

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

[英]QML - How to know if a child has keyboard focus

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

但是我找不到一种聪明的方法来弄清楚我的一个子项或它们的子项或我下面的任何人是否都将键盘焦点对准了。

FocusScope的文档说:

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

因此当将焦点分配给包含的FocusScope时,FocusScope 会将activeFocus设置为false 有没有办法确定是否是这种情况? 我怎么知道至少包含一个FocusScope的焦点?

焦点是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;
            }
        }
    }
}

...我们需要两个可以集中的大区域,我们不必明确地集中内部的TextInput(因为它们理想情况下将位于自定义组件内部,因此无法从外部访问)。

因此,当单击某个区域时,我们将活动焦点赋予父范围,并且该范围自动将其代理给具有focus:true标志的子级(表示它希望获得焦点,而不是拥有焦点,这就是为什么每个TextInput中都有一个标志)。

相反,需要知道内部输入是否具有有效焦点的项目将仅请求范围是否具有内部焦点。 他们不必在意里面的东西。

如果该范围包含另一个具有focus:true的范围,则焦点将再次转发,直到到达需要焦点的最新项目为止。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM