Qml属性vs别名

时间:2017-08-12 21:31:58

标签: qml

要获取父组件的属性值并将它们分配给子属性,我们可以直接使用父属性

//Component1.qml:

Item
{
    Component2
    {
        contentWidth:200
    }
}

//Component2.qml:

Item
{
    property int contentWidth:0
    Rectangle
    {
        width:parent.contentWidth
    }
}

或创建别名

//Component1.qml:

Item
{
    Component2
    {
        contentWidth:200
    }
}

//Component2.qml:

Item
{
    property alias contentWidth:rect.width
    Rectangle
    {
        id:rect
    }
}

什么是最合适的方式和时间?

我的想法是,当父属性仅用于一个特定的子组件属性时,应该使用别名( contentWidth 仅用于 rect.width

2 个答案:

答案 0 :(得分:3)

你的两个例子之间存在非常显着的差异 property alias something: id.property自动创建双向绑定,而在示例1中,您只能单向绑定。

含义:如果更改contentWidth的值,则两个Rectangle的宽度会发生变化 - 如果现在(假设)某个内部甚至在组件{{ 1}}会改变宽度,这个改变只会反映在例2中,而在例1中,绑定会被破坏。

我不知道实现细节,但是如果你明确告诉它可能更容易优化它,它不仅仅是绑定它,而是实际上是相同的值。

一个简单的经验法则是: 如果它在逻辑上是别名,请使用Rectangle,因此属性本质上是相同的。如果您想要将孩子的属性导出到外部,甚至是整个孩子,通常会出现这种情况。

使用属性绑定,如果你想让它们的值绑定,因为它们的值完全相同,或者特别是如果它不相同,但是它只依赖于另一个(但不一定是其他方式,因为默认情况下你只有单向绑定)

property alias ...:...可能与readonly property Item child1: idOfChildOne具有相同的效果,但从语义上讲,第一个就像一个存放指针的存储(由于只读标志而被禁止更改)但是第二个 直接访问此孩子。所以通常你想使用第二个(由QtDesigner完成)。

答案 1 :(得分:0)

使用别名意味着对属性使用另一个名称,例如C ++引用类型声明,它必须在创建时被初始化。别名的主要用法是能够将内部范围属性导出到对象范围的外部范围。使用属性跨qml的绑定功能实现此目标。别名和用于导出的简单属性之间存在显着差异。如果我们使用属性将其发送到外部作用域变量,则不是问题,如果我们想像阅读一样使用它。当我们想要将该属性绑定到新值以将其重新分配给另一个静态值时;这一次我们丢失了与内部属性绑定的属性。因此,如果我们要导出,则只需使用alias。