TabView中的“未定义对象”

时间:2019-05-28 15:33:12

标签: qt tabs qml qt5.9

试图使它在Qt 5.9版中正常工作

似乎每当我在QML Tab中创建对象时,父对象(或任何父对象的父对象,等等)都无法识别它。如何获取父对象以识别选项卡中的对象?或者,如果不可能的话,那么在Tab中调用对象功能的解决方法是什么?

我将代码简化为以下简化示例:

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 个答案:

答案 0 :(得分:1)

Tab is a subclass of Loader,因此Rectangle直到Tab处于活动状态时才创建。

  

标签被延迟加载;只有最新的标签(例如,通过单击它们)才具有有效的内容。您可以通过将active属性设置为 true

来强制加载标签

因此id: myGrandChild仅在加载程序中自动创建的(源)组件中可用。

解决方案是激活标签页并使用myChild.item来给孩子找地址

(未经测试)