Структура объектов в 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 возвращает контейнер со всеми дочерними объектами, которые находятся в текущем объекте.