«Объект не определен» в TabView - PullRequest
0 голосов
/ 28 мая 2019

Попытка заставить это работать в Qt версии 5.9

Кажется, что всякий раз, когда я создаю объект на вкладке QML , он не распознается родительским объектом (или любым из родителей родителя и т. Д.). Как заставить родительские объекты распознавать объект на вкладке? Или, если это невозможно, то каков обходной путь для вызова функции объекта во вкладке?

Я свел код к этому упрощенному примеру:

import QtQuick 2.9
import QtQuick.Window 2.2
import QtQuick.Controls 1.4

Window {
    Rectangle {
        id: myFunctionCaller

        Component.onCompleted: {
            myParent.myFunction();
            myChild.myFunction();
            myGrandChild.myFunction();
        }
    }

    TabView {
        id: myParent
        property Rectangle grandchild: myGrandChild
        onGrandchildChanged: console.log("Parent recognizes GrandChild");

        function myFunction() {
            console.log("I'm the Parent");
        }

        Tab{
            id: myChild
            property Rectangle grandchild: myGrandChild
            onGrandchildChanged: console.log("Child recognizes GrandChild");

            function myFunction() {
                console.log("I'm the Child");
            }

            Rectangle {
                id: myGrandChild
                function myFunction() {
                    console.log("I'm the GrandChild");
                }
            }
        }
    }
}

Я ожидаю этот вывод:

I'm the Parent
I'm the Child
I'm the GrandChild
Parent recognizes Grandchild
Child recognizes Grandchild

Однако я получаю такой вывод:

I'm the Parent
I'm the Child
ReferenceError: myGrandChild is not defined.
ReferenceError: myGrandChild is not defined.
ReferenceError: myGrandChild is not defined.

Ошибка возникает в следующих строках:

myGrandChild.myFunction();
onGrandchildChanged: console.log("Parent recognizes GrandChild");
onGrandchildChanged: console.log("Child recognizes GrandChild");

1 Ответ

1 голос
/ 28 мая 2019

Tab является подклассом Loader, поэтому Rectangle не создается до тех пор, пока Tab не станет активным.

Вкладки загружаются лениво;только вкладки, которые были сделаны текущими (например, нажав на них), будут иметь действительный контент.Вы можете принудительно загрузить вкладки, установив для активного свойства значение true

Таким образом, id: myGrandChild доступен только в (исходном) Компоненте, автоматически созданном в Loader.

Решение состоит в том, чтобы активировать вкладку и обратиться к ребенку с помощью myChild.item

(не проверено)

...