Evgenii Legotckoi
Evgenii Legotckoi02 листопада 2015 р. 02:55

QML - Урок 010. Доступ до дочірніх об'єктів у TabView

Структура об'єктів у Qml є ієрахічним деревом, в якому, щоб отримати доступ до властивостей об'єктів нижчележачого рівня необхідно звернутися до початкового об'єкта, далі вибрати дочірній об'єкт і вибрати властивість дочірнього об'єкта, до якого потрібно отримати доступ.

Але у випадку з TabView даний підхід не спрацює, оскільки об'єкти вкладок Tab додаються динамічно, отже необхідно отримати доступ до вкладки за її індексом, забрати об'єкт item з неї та знайти цікавий для нас дочірній об'єкт у даному item також за індексом. І вже після цього отримати доступ до нас, що цікавить властивості. Також рекомендую звернути увагу на те, що в даному випадку автозавершення коду не працює у QtCreator.

Причому, швидше за все, Ви отримаєте помилку наступного змісту:

ReferenceError: "щось" не визначено


Структура проекту для роботи з 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.

Відеоурок

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

Terabaytus
  • 04 червня 2018 р. 04:49

Добрый день, не совсем понятна закономерность вызовов, то есть

здесь любой объект.get (0/*индекс*/). Если у меня нет группы что будет.children[0].text 
можно более подробно ?

Evgenii Legotckoi
  • 04 червня 2018 р. 06:38

не обязательно, но вполне возможно, children возвращает контейнер со всеми дочерними объектами, которые находятся в текущем объекте.

Этот метод идёт ещё из QObject. Потом можно в цикле по objectName искать нужный объект.

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
AD

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:50бали,
  • Рейтинг балів-4
m
  • molni99
  • 26 жовтня 2024 р. 01:37

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:80бали,
  • Рейтинг балів4
m
  • molni99
  • 26 жовтня 2024 р. 01:29

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:20бали,
  • Рейтинг балів-10
Останні коментарі
ИМ
Игорь Максимов22 листопада 2024 р. 11:51
Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii Legotckoi31 жовтня 2024 р. 14:37
Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZE19 жовтня 2024 р. 08:19
Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов05 жовтня 2024 р. 07:51
Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas505 липня 2024 р. 11:02
QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Тепер обговоріть на форумі
Evgenii Legotckoi
Evgenii Legotckoi24 червня 2024 р. 15:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey115 листопада 2024 р. 06:04
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProject04 червня 2022 р. 03:49
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9Anonim25 жовтня 2024 р. 09:10
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

Слідкуйте за нами в соціальних мережах