Qml属性vs别名

问题描述 投票:2回答:2

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

//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
    }
}

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

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

qml
2个回答
3
投票

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

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

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

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

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

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


0
投票

使用别名意味着使用另一个名称作为属性,如C ++引用类型声明它必须在创建时初始化。别名的主要用法是将内部范围属性导出到对象范围的外部范围。也可以使用属性跨越qml的绑定特性实现这个目标。在别名和导出的简单属性之间有很大的不同。如果我们使用属性发送到外部范围变量,如果我们想要像阅读一样使用它就没有问题。问题来自于我们想要将该属性绑定到新值以重新设置为另一个静态值;这时我们将失去绑定到我们内部属性的属性。如果我们要导出只使用别名。

© www.soinside.com 2019 - 2024. All rights reserved.