我想我知道如何使用FocusScopes以及如何处理键盘焦点。
但我找不到一个聪明的方法来弄清楚我的一个孩子的物品 或者他们或我下面的任何人都有键盘焦点。
FocusScope 的文档说:
当焦点范围接收到活动焦点时,包含的元素 焦点集(如果有的话)也得到了主动焦点。如果这个元素也是 在FocusScope中,代理行为仍在继续。两者都是重点范围 并且子聚焦项目将设置activeFocus属性。
因此,FocusScope 会将activeFocus设置为false 当重点放在一个包含的FocusScope上时。有没有办法弄清楚是否是这种情况?我怎么知道至少一个包含的FocusScope是否得到了关注?
答案 0 :(得分: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;
}
}
}
}
...我们想要两个可以有焦点的大区域,我们并不需要明确地关注内部TextInput(因为它们理想情况下会在自定义组件中,因此无法从外部访问)。
因此,当单击某个区域时,我们将主动焦点放在父范围内,并且范围会自动将其代理到具有焦点的子项:true标志(意味着它需要焦点,而不是它需要焦点,这就是我们在每个TextInput中都有一个标志的原因。
如果内部输入具有活动焦点,则需要知道的项目将简单地请求范围是否具有该输入。他们没有必要关心是在里面。
如果范围包含另一个具有焦点的范围:true,则会再次转发焦点,直到它到达需要焦点的最新项目。