Структура объектов в Qml представляет собой иерахическое дерево, в котором, чтобы получить доступ к свойствам объектов нижележащего уровня необходимо обратиться к первоначальному объекту, далее выбрать дочерний объект и выбрать свойство дочернего объекта, к которому требуется получить доступ.
Но в случае с TabView данный подход не сработает, поскольку объекты вкладок Tab добавляются динамически, следовательно необходимо получить доступ к вкладке по её индексу, забрать объект item из неё и найти интересующий нас дочерний объект в данном item также по индексу. И уже после этого получить доступ к интересующему Нас свойству. Также рекомендую обратить внимание на то, что в данном случае автозавершение кода не работает в QtCreator.
Причём, скорее всего Вы получите ошибку следующего содержания:
ReferenceError: 'something' is not defined
Структура проекта для работы с TabView
В данном примере будет использоваться проект созданный по умолчанию:
- QmlTableView.pro - профайл проекта;
- main.cpp - основной файл исходных кодов C++;
- main.qml - файл исходных кодов qml-слоя.
main.qml
Поскольку в проекте изменения вносятся только в файл main.qml, то не буду углубляться в описание файлов, которые остаются созданными по умолчанию.
А что касается данного файла, то логика работы приложение следующая. Имеется главное окно приложения, в котором находится объект Button и объект TabView. В TabView находится две вкладки, в одной из которых помещена вторая кнопка. При нажатии на первую кнопку меняется текст на второй, при нажатии на вторую кнопку меняется текст на первой кнопке.
import QtQuick 2.5 import QtQuick.Controls 1.4 ApplicationWindow { visible: true width: 640 height: 480 title: qsTr("Qml TabView") // Кнопка, по нажатию которой изменится текст кнопки в объекте Tab Button { id: button text: qsTr("Кнопка 1") anchors.top: parent.top anchors.topMargin: 5 anchors.left: parent.left anchors.leftMargin: 5 /* Забираем вкладку с целевой кнопкой, * далее объект, который формирует набивку вкладки. * После чего вычленяем нужный дочерний объект по индексу. * И уже из этого объекта берём требуемое свойство, * то есть текст, которому присваиваем новое текстовое значение * */ onClicked: { tabView.getTab(0).item.children[0].text = "Кнопка 1" } } /* TabView, в первой вкладке которого находится кнопка, * по нажатию кнопки которой из изменится текст в первой кнопке */ TabView { id: tabView anchors.top: button.bottom anchors.topMargin: 5 anchors.left: parent.left anchors.right: parent.right anchors.bottom: parent.bottom Tab { id: tab1 title: qsTr("Первая вкладка") component: Item { id: rect1 Button { id: buttonTab text: qsTr("Кнопка 2") anchors.top: parent.top anchors.topMargin: 5 anchors.left: parent.left anchors.leftMargin: 5 /* Переписываем текстовое значение * первой кнопки * */ onClicked: { button.text = "Кнопка 2" } } } } Tab { id: tab2 title: qsTr("Вторая вкладка") } } }
Итог
В результате проделанной работы Вам удастся получить доступ к дочерним объектам во вкладках TabView.
Рекомендую также ознакомиться с видеоуроком, в котором дано более подробное объяснение возникающей ошибки "Reference error: something is not defined" при неправильном обращении к объектам во вкладках TabView.
Добрый день, не совсем понятна закономерность вызовов, то есть
можно более подробно ?не обязательно, но вполне возможно, children возвращает контейнер со всеми дочерними объектами, которые находятся в текущем объекте.