选项卡不活动时未定义的元素

Posted

技术标签:

【中文标题】选项卡不活动时未定义的元素【英文标题】:Undefined element when tab is not active 【发布时间】:2015-03-12 20:59:34 【问题描述】:

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

如果选项卡未处于活动状态,为什么未定义?我该如何解决?

谢谢!

【问题讨论】:

【参考方案1】:

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

标签被延迟加载;仅已变为当前的选项卡(对于 例如,通过单击它们)将具有有效内容。你可以强制 通过将 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,它工作正常!

【讨论】:

【参考方案2】:

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

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

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

Tab 
    id: t2
    active: true
    Rectangle 
    

【讨论】:

以上是关于选项卡不活动时未定义的元素的主要内容,如果未能解决你的问题,请参考以下文章

当我失去焦点时选项卡不起作用

位置:'底部' - 选项卡不允许滑动

为啥 jQuery ui 选项卡不起作用?

动态生成时引导选项卡不起作用

引导选项卡不切换

选项卡布局选项卡不改变背景颜色