QML 中的 forceActiveFocus() 与 focus = true

Sil*_*lex 9 qt focus qml

我阅读了有关以下内容的文档:

但仍然不清楚何时应该使用forceActiveFocus()方法将focus属性设置为 true,反之亦然。

der*_*erM 11

正如文档所述

对于非常简单的情况,有时只需设置 focus 属性就足够了。

这种简单的情况是,如果Itemwhich getsfocus: true没有被 a 包围FocusScope,则可能没有焦点。

然后它继续:

> 在每个焦点范围内,一个对象可能将 Item::focus 设置为 true。如果多个 Item 设置了 focus 属性,则最后一个设置焦点的类型将获得焦点,其他类型未设置,类似于没有焦点范围时。

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

从我们了解到的事实是设置focus: true是不够的,如果它Item是 a 的后继者,FocusScope因为这FocusScope将需要activeFocussu 后继者Item将收到activeFocus。这是递归的,并且意味着FocusScope将需要具有focus: true并且可能的前驱FocusScope需要activeFocus等等。这导致某种 焦点树

这个焦点树组成了内部节点属于FocusScopeS和叶子Item秒。AFocusScope可能是一片叶子,但我不知道为什么它应该是。

在此树中,每个FocusScope可具有最多一个子节点(无论是Item)或FocusScope内节点具有)focus === true。遍历这个树中,其中所有遍历节点具有路径以下focus === true所遍历的节点具有也activeFocus === true作为每个FocusScope可以仅具有最多一个子节点focus === true只有一个这样的路径。

Column {
    FocusScope {
        focus: false
        width: 100
        height: 100
        Text {
            focus: true
            text: 'has focus ' + focus + '\nhas activeFocus ' + activeFocus
        }
    }
    FocusScope {
        focus: true
        width: 100
        height: 100
        Text {
            focus: true
            text: 'has focus ' + focus + '\nhas activeFocus ' + activeFocus
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这里我们有两个FocusScopes。两者都有一个有 的孩子focus,但由于只有第二个FocusScopefocus本身,它的孩子有activeFocus

采用forceActiveFocus()遍历焦点树,套focustrue了在路上的每个节点,因此Item具有activeFocus在最后。