TabView / Tab中的项目无法访问

时间:2015-05-28 06:43:36

标签: qt qml qtquick2 qtquickcontrols

假设我们有一个如下的QML文件:

Window {

    Component.onCompleted: rect.color  ="green"

    TabView {
        Tab {
            Rectangle {
                id:  rect
                color: "white"
            }
        }
    }
}

当我运行此代码时,由于某种原因,它给了我这个错误:

  

ReferenceError:未定义rect

有人可以说它是一个范围问题,但以下代码运行良好:

Window {

    Component.onCompleted: rect.color  ="green"

    Item {
        Item {
            Rectangle {
                id:  rect
                color: "white"
            }
        }
    }
}

在我的情况下,我有一个包含选项卡和控件的大表单,我将所有控件传递给多个函数来验证表单,即一些代码如下:

function onClose() {
    validate(control1);
    validate(control2);
    // etc
}

但是在id访问控件时,我收到了上述错误。

2 个答案:

答案 0 :(得分:0)

如何将矩形绑定到颜色参​​数而不是硬编码值?

这将进一步分离您的模型和视图代码,以使其在项目的其他位置更具可读性...尝试:

Window {

    property string myColor: "White"
    Component.onCompleted: myColor = "Green"

    TabView {
        Tab {
            Rectangle {
                id:  rect
                color: myColor
            }
        }
    }

}

要查看QML对象树,您需要以调试模式启动项目。然后拆分代码窗口,以显示“本地和表达式”视图(右侧复选框勾选)。您将看到您的根项和嵌套在树中的所有其他控件,现在您可以直接编辑其属性的值,并且更改将立即呈现。有一个关于调试的youtube视频教程:https://youtu.be/mPXn6L2Wftc?t=19m55s

我不确定树是否会让您在运行时访问控件,但它可能会帮助您进行调试。

答案 1 :(得分:0)

好的,因为无法从外部访问Tab项目,我认为可以通过这种方式完成:

TabView {
    id: tabView
    Tab {
        title: "tab1"
        function validate() { /* validate all the controls related to tab1 only */ }
        Item { id: item1 }
        Item { id: item2 }
    }
    Tab {
        title: "tab2"
        function validate() { /* validate all the controls related to tab2 only */ }
        Item { id: item3 }
        Item { id: item4 }
    }
    function validateTabs() {
        for(var i = 0; i < tabView.count;i ++) {
            var tab = tabView.getTab(i);
            if(tab && tab.active && tab.item.validate) {
                if(!tab.item.validate())
                    return false;
            }
        }
        return true;
    }
}

好的一点是,如果某些Tab未被打开且未更改,则无法进行验证。