3

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

Window {

    Component.onCompleted: rect.color  ="green"

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

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

ReferenceError:矩形未定义

有人可以说这是范围问题,但以下代码可以正常工作:

Window {

    Component.onCompleted: rect.color  ="green"

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

在我的例子中,我有一个很大的表单,里面有选项卡和控件,我将所有控件传递给几个函数来验证表单,即像这样的一些代码:

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

但是在通过id我访问控件时出现上述错误。

4

2 回答 2

0

将矩形绑定到颜色参​​数而不是硬编码值怎么样?

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

Window {

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

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

}

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

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

于 2015-05-29T11:02:10.550 回答
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内容未打开且未更改,则不会对其进行验证。

于 2015-06-02T23:21:44.110 回答