Qml属性 vs 别名

5
为了获取父组件属性的值并将其分配给子组件属性,我们可以直接使用父组件属性。
//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个回答

13

你的这两个例子有一个非常显著的区别。
property alias something: id.property自动创建了双向绑定,而在第一个例子中,你只有单向绑定。

意思是:如果你改变了contentWidth的值,那么这两个Rectangle的宽度都会改变 - 如果现在(假设)组件Rectangle内部发生了一些变化,这种变化只会反映在例子二中,在例子1中,绑定将被断开。

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

一个简单的经验法则是: 如果逻辑上是别名,则使用property alias ...:...,因此属性本质上是相同的。通常情况下,如果你想将属性从子项导出到外部,甚至是整个子项,就应该使用别名。

如果你想要将它们的值绑定在一起,因为它们的值巧合地相同或特别是如果不同,但其中一个仅依赖于另一个(但默认情况下只有单向绑定),则使用属性绑定。 readonly property Item child1: idOfChildOne可能会产生与property alias child1: idOfChildOne相同的效果,但从语义上讲,第一个就像是存储指针(由于只读标志而禁止更改),但第二个实际上是对这个子项的直接访问。因此,通常你想使用第二个(就像QtDesigner所做的那样)。


1
使用别名意味着为属性使用另一个名称,就像C++引用类型声明一样,必须在创建时进行初始化。别名的主要用途是将内部作用域属性导出到对象作用域的外部作用域中。此外,我们还可以通过qml的绑定功能使用属性来实现此目标。别名和简单属性之间的差异非常显著。如果我们使用属性发送到外部作用域变量,则仅用于读取不会有问题。当我们想将该属性绑定到新值以重新分配给另一个静态值时,问题就来了;此时我们失去了属性绑定到我们内部属性的能力。因此,如果要导出,请使用别名。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接