qt - QML 焦点如何传播?

标签 qt focus qml qtquick2 qtquickcontrols2

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

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

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

如果这是真的,那么当我按下 MyItem.qml 或 MyDerivedItem.qml 中的任何 TextFields 时,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"
    }

    //...
}

最佳答案

这有点令人沮丧 here .据此传播是:Qt -> QQuickWindow -> Item-with-focus。
没有遍历对象树,但聚焦直接发生。

此规则有一个异常(exception),即 FocusScope充当焦点 Item朝现场或FocusScope在更高的层次结构中。
所以基本上你可以说,除了对象树,还有第二个焦点树,其中每个节点都是一个 FocusScope和所有其他 Items是叶子。
每个FocusScope -Node 可能有一个有焦点的 child 。Item的 child 对象树中的对象可能是焦点树中对象父对象的兄弟。

关于qt - QML 焦点如何传播?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41871701/

相关文章:

python - Qt QGraphicsDropShadowEffect 没有显示

python - : mean in front of a path? 是什么意思

c++ - 从 C++ 实例化 QML

c++ - 在 Qml 场景下使用 OpenGL 渲染时出现奇怪的错误

c++ - 当我将 Char 指针设置为 Int 值时 QT 崩溃

c++ - 用于数据传输的标准字节通信协议(protocol)

C# winforms 应用程序 : event handler when returning (focus) from an external application

qt - 选项卡未激活时未定义的元素

java - 启动 Activity android 时聚焦 ListView 中的第一项

html - 如何更改外部元素的 CSS?