繁体   English   中英

QML焦点是如何传播的?

[英]How does QML focus propagate?

我试图弄清楚如何在我的应用程序中正确设置焦点。

我有一个组件MyItem.qml,我想在它的任何一个孩子获得焦点时改变它的背景。 我还有一个MyDerivedItem.qml派生自MyItem.qml,如果它的任何子节点获得焦点,它也应该改变基类的背景。

如果我正确理解文档,如果组件获得焦点,则层次结构中其所有父项的focus属性将设置为true(或者直到达到FocusScope组件)。

如果这是真的,那么当我按下MyItem.qml或MyDerivedItem.qml中的任何TextField时,myItem.focus属性应该更改为true并且背景会更改其颜色。

我试图做一个我想做的小例子,但它没有像我期望的那样表现。

//main.qml
import QtQuick.Controls 2.0

ApplicationWindow {
    height: 768
    width: 1024
    visible: true

    MyDerivedItem {
        anchors.top: parent.top
        anchors.left: parent.left
        anchors.bottom: parent.bottom
        width: parent.width / 2
    }
    MyDerivedItem {
        anchors.top: parent.top
        anchors.right: parent.right
        anchors.bottom: parent.bottom
        width: parent.width / 2
    }
}

//MyItem.qml
import QtQuick 2.7
import QtQuick.Controls 2.0

Rectangle {
    id: myItem

    default property alias data: column.data

    color: focus ? "red" : "green"

    Column {
        id: column

        TextField {
            placeholderText: "Input Text Here"
        }
    }
}

//MyDerivedItem.qml
import QtQuick 2.7
import QtQuick.Controls 2.0

MyItem {
    id: myDerivedItem

    TextField {
        placeholderText: "Derived Input Text Here"
    }

    TextField {
        placeholderText: "Derived Input Text Here"
    }

    TextField {
        placeholderText: "Derived Input Text Here"
    }

    TextField {
        placeholderText: "Derived Input Text Here"
    }

    //...
}

这有点doumented 这里 根据传播的结果:Qt - > QQuickWindow - > Item-with-focus。 没有对象树的遍历,但聚焦反而直接发生。

有一个例外,那就是FocusScope充当聚焦Item对场景或FocusScope更高hirarchy。 所以基本上你可以说,除了对象树之外,还有第二个焦点树 ,其中每个节点都是FocusScope ,所有其他Items都是叶子。
每个FocusScope -Node可能有一个具有焦点的子项。
对象树中Item的子节点可能是焦点树中对象父节点的兄弟节点。

我的问题的解决方案是一个小的改变。 FocusScope添加到MyItem.qml ,如下所示:

//MyItem.qml
import QtQuick 2.7
import QtQuick.Controls 2.0

FocusScope {
    id: focusScope

    default property alias data: column.data

    Rectangle {
        id: myItem

        anchors.fill: parent
        color: focusScope.focus ? "red" : "green"

        Column {
            id: column
            anchors.fill: parent

            TextField {
                placeholderText: "Input Text Here"
            }
        }
    }
}

暂无
暂无

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

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