QML SplitView: как этот элемент управления обрабатывает свои дочерние элементы во внутреннем элементе?

Я просмотрел исходный код SplitView (%QT_SOURCE_PATH%\qml\QtQuick\Controls\SplitView.qml) и заметил, что он использует 3 элемента для управления разделителями и элементами:

Item {
    id: contents
    visible: false
    anchors.fill: parent
}
Item {
    id: splitterItems
    anchors.fill: parent
}
Item {
    id: splitterHandles
    anchors.fill: parent
}

Согласно коду, новые элементы помещаются в элемент splitterItems с помощью функции addItem_impl(item). Функция addItem_impl(item) вызывается из функции init(), которая передает каждый дочерний элемент из Item с идентификатором contents. Но мне интересно, как все дочерние элементы из элемента root были помещены в элемент contents?


person MaxQwerty    schedule 13.10.2018    source источник


Ответы (1)


С помощью свойства по умолчанию :

default property alias __contents: contents.data

Из документации:

Определение объекта может иметь одно свойство по умолчанию. Свойство по умолчанию — это свойство, которому присваивается значение, если объект объявлен в определении другого объекта без объявления его как значения для определенного свойства.

[...]

Вы заметите, что дочерние объекты могут быть добавлены к любому типу на основе Item без явного добавления их к дочернему свойству. Это связано с тем, что свойством по умолчанию Item является его свойство данных, и любые элементы, добавленные в этот список для Item, автоматически добавляются в список его дочерних элементов.

Свойства по умолчанию могут быть полезны для переназначения дочерних элементов элемента. См. пример TabWidget, в котором используется свойство по умолчанию для автоматического переназначения дочерних элементов TabWidget в качестве дочерних элементов внутреннего ListView. См. также Расширение QML.

person Mitch    schedule 13.10.2018