要获取父组件的属性值并将它们分配给子属性,我们可以直接使用父属性
//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 )
答案 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。