Qt 子对象和对象作为属性之间的区别?

Qt 子对象和对象作为属性之间的区别?,qt,qml,Qt,Qml,我想知道子对象和作为属性的对象之间有什么区别: Rectangle { Button { id: myButton } } 及 我知道您可以从QML代码()中的更多位置访问第一个示例中的按钮(通过id)。是否存在性能差异或其他差异 qt.io wiki在这方面对我没有帮助。在第二种情况下,按钮将不可见。它将作为属性存在,但由于它不是对象树中的子对象,因此不会显示。因此,将可视元素作为属性是非常无用的 对象及其属性之间没有父/子关系。它只存在于QObject和派

我想知道子对象和作为属性的对象之间有什么区别:

Rectangle {
    Button {
        id: myButton

    }
}

我知道您可以从QML代码()中的更多位置访问第一个示例中的按钮(通过id)。是否存在性能差异或其他差异


qt.io wiki在这方面对我没有帮助。

在第二种情况下,按钮将不可见。它将作为属性存在,但由于它不是对象树中的子对象,因此不会显示。因此,将可视元素作为属性是非常无用的

对象及其属性之间没有父/子关系。它只存在于
QObject
和派生树中,它们是构建Qt应用程序的基本概念。此外,这意味着不能将
int
作为子对象,它只能是一个属性。属性意味着数据,而不是结构

正如cmannett85所指出的,根据子对象的类型,子对象也将作为列表属性进行接口,但在QML中,您应该很少关注这一点,如果有的话。。。但是,尽管孩子们被当作财产,财产却得不到免费的待遇

请注意,您可以采用两种方式

Rectangle{
    property alias myButton: button

    Button {
        id: button
    }        
}

这样,按钮将可见,并且如果您希望从当前QML文件外部访问它,您仍然可以将其作为属性引用,而当前QML文件不适用于
id
s-它们仅对它们所在的QML文件有效。动态作用域适用于属性,但不适用于ID。

这两个对象都附加到属性。
中的所有聚合对象都附加到默认的
数据
,然后根据其类型将它们复制到
子项
资源
属性中


还要注意,
Item
派生对象仅在构成场景图的可视对象树的一部分时可见,并且整个场景图只能有一个根。因此,您不能只将
派生对象分配给任何属性,并期望它在不做额外工作的情况下可见。

关于这个主题的文档很多,可以使用您在问题中使用的术语找到。例如:你可能想看看这两个例子的根本区别是什么。谢谢你,我读过,但以前没有读过。现在,在这两个答案的帮助下,我很清楚。所以我不能在第二个例子中使用锚,对吗?
Rectangle{
    property alias myButton: button

    Button {
        id: button
    }        
}