gpt4 book ai didi

qt - QML - 如何知道 child 是否有键盘焦点

转载 作者:行者123 更新时间:2023-12-04 12:52:49 24 4
gpt4 key购买 nike

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

但我找不到一种聪明的方法来弄清楚我的一个 child 的元素
或他们或我以下的任何人都有键盘焦点。

的文档FocusScope 说:

When a focus scope receives active focus, the contained element with focus set (if any) also gets the active focus. If this element is also a FocusScope, the proxying behavior continues. Both the focus scope and the sub-focused item will have activeFocus property set.



因此,FocusScope 将 activeFocus 设置为 false
当焦点被赋予包含的 FocusScope 时。有没有办法确定是否是这种情况?我怎么知道至少一个包含的 FocusScope 是否收到了焦点?

最佳答案

Focus 是 QtQuick 中的一个链。
这意味着所有祖先 FocusScope 一直到当前事件的 child 都获得事件焦点。

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 的范围,则焦点将再次转发,直到到达需要焦点的最新项目。

关于qt - QML - 如何知道 child 是否有键盘焦点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18323132/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com