Проверьте, имеет ли потомок activeFocus == true в QML - PullRequest
0 голосов
/ 06 июня 2019

В глубоко вложенном графическом интерфейсе QML есть простой способ узнать, есть ли у какого-либо ребенка, внука и т. Д. Элемент activeFocus == true?

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

1 Ответ

1 голос
/ 06 июня 2019

Вместо детализации иерархии от вашего базового предка, вы можете перейти от текущего 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"
                            }
                        }
                    }
                }
            }
        }
    }
}
...