Focus 是 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 中有一个标志)。
需要知道内部输入是否具有活动焦点的项目将改为简单地请求范围是否具有它。他们不必关心是在里面。
如果范围包含另一个具有焦点:true 的范围,则再次转发焦点,直到它到达想要获得焦点的最新项目。