选项卡未处于活动状态时的未定义元素

Undefined element when tab is not active

当我尝试访问 Tab 元素的子元素时,如果它不是活动的,QML 会抛出一条错误消息说 undefined

main.qml

import QtQuick 2.4
import QtQuick.Controls 1.3
import QtQuick.Window 2.0

    ApplicationWindow {
        TabView {
            Tab {
                id: mytab1
            }
            Tab {
                id: myTab2
                Rectangle {
                    //(...)
                }
            }
        }

        Connections {
            target: eventManager

            onData: {
                var scene = myTab2.children[0];
                console.log(scene);
            }
        }
    }

因此,如果 myTab2 处于活动状态,我可以在控制台中看到 QQuickItem_QML_15(0x27f1e2e0)。如果 myTab2 未激活,则 qml 抛出 TypeError: Cannot read property 'children' of undefined.

如果选项卡未激活,为什么是未定义的?我该如何解决?

谢谢!

Qt documentation 网站上,我找到了解决方案。

Tabs are lazily loaded; only tabs that have been made current (for example, by clicking on them) will have valid content. You can force loading of tabs by setting the active property to true:

import QtQuick 2.4
import QtQuick.Controls 1.3
import QtQuick.Window 2.0

ApplicationWindow {
    TabView {
        Tab {
            id: mytab1
            active: true
        }
        Tab {
            id: myTab2
            active: true
            Rectangle {
                //(...)
            }
        }
    }

    Connections {
        target: eventManager

        onData: {
            var scene = myTab2.children[0];
            console.log(scene);
        }
    }
}

所以,我在两个选项卡中都添加了 属性 active: true,而且效果很好!

A TabView 在激活选项卡之前不会创建其内容项。

您的示例从选项卡 1 开始,此时选项卡 2 中的矩形不存在,因此您得到 undefined。如果您激活选项卡 2,将创建矩形,然后如果您返回选项卡 1,您将不会得到 undefined.

一个Tab继承了一个Loader,并附带了一个active 属性。我想 Loader 组件中存在一个优化,可以延迟加载直到元素变得可见。如果您在 Tab 中设置 active: true,它将在激活选项卡之前加载。请注意,这不会使第二个选项卡处于活动状态时打开选项卡视图。

Tab {
    id: t2
    active: true
    Rectangle {
    }
}