选项卡未激活时未定义的元素

时间:2015-03-12 20:59:34

标签: qt qml qtquick2

当我尝试访问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

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

谢谢!

2 个答案:

答案 0 :(得分:2)

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

  

标签被延迟加载;只有当前的标签(for   例如,通过点击它们)将具有有效的内容。你可以强迫   通过将active属性设置为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,它运行正常!

答案 1 :(得分:2)

在激活标签页之前,TabView不会创建其内容项。

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

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

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