首页 > 解决方案 > 检查后代在 QML 中是否具有 activeFocus == true

问题描述

在深度嵌套的 QML GUI 中,是否有一种简单的方法可以找出 Item 的任何子或孙等是否有activeFocus == true

Item {
  id: intermediateItem
  visible: anyDescendantHasActiveFocus(intermediateItem) ? true : false
  Item {
    Item {
      Item {
        id: hasActiveFocus
        Component.onCompleted: hasActiveFocus.forceActiveFocus()
      }
    }
  }
}

标签: qtqmlqt5qqmlcomponent

解决方案


无需从基础祖先向下钻取层次结构,您可以从当前向上activeFocusItem

import QtQuick 2.9
import QtQuick.Window 2.2
import QtQuick.Controls 2.2

ApplicationWindow {
    id: window
    visible: true
    width: 640
    height: 480

    function anyDescendantHasActiveFocus(ancestor) {
        let item = ancestor.Window.activeFocusItem;
        while (item) {
            if (item === ancestor)
                return true;
            item = item.parent;
        }
        return false;
    }

    Row {
        anchors.centerIn: parent
        spacing: 10
        Repeater {
            model: 3
            Rectangle {
                width: 200
                height: 100
                border.width: 1
                border.color: anyDescendantHasActiveFocus(this) ? "red" : "black"
                Rectangle {
                    anchors.fill: parent; anchors.margins: 10
                    border.width: 1
                    Rectangle {
                        anchors.fill: parent; anchors.margins: 10
                        border.width: 1
                        Rectangle {
                            anchors.fill: parent; anchors.margins: 10
                            border.width: 1
                            Button {
                                anchors.centerIn: parent
                                text: "Focus me"
                            }
                        }
                    }
                }
            }
        }
    }
}

推荐阅读