QtQuick - "parent item" 是什么意思?

QtQuick - what is meant by "parent item"?

以下QML代码:

Window {
    id: window

    width: 450
    height: 700
    visible: true

    StackView {
        id: mainStack

        property Item itemTest: Item {
            id: itemTest

            ColumnLayout {
                id: mainLayout

                width: mainStack.width

                ScrollView {
                    id: scrollview

                    Layout.fillWidth: true
                    Layout.fillHeight: true
                    clip: true
                    ScrollBar.horizontal.policy: ScrollBar.AlwaysOff

                    ColumnLayout{
                        id: colLayout
                        anchors.fill: scrollview
                    }
                }
            }
        }
        initialItem: itemTest
        anchors.fill: parent
    }
}

输出“QML ColumnLayout:无法锚定到不是父项或兄弟项的项目。”

将上面代码中的“anchors.fill: scrollview”替换为“anchors.fill: parent”会使此消息消失,但 ColumnLayout 似乎不会填充 ScrollView。

鉴于这种行为,我得出结论,这个 QML 文件中的 ScrollView 实际上不是“colLayout”的父级,这与我对 QML 中父级工作方式的第一直觉相悖。

谁能给我解释一下 QML 中关键字“parent”的确切含义?非常感谢。

问题在于控件使用 contentItem 的概念。虽然 ScrollView 本身是一个 Control,它本身又是一个 Item,但子项是另一个名为 contentItem.

的 Item 的父项

更多信息在这里:

https://doc.qt.io/qt-5/qml-qtquick-controls2-control.html#contentItem-prop

另请参阅此处的评论:

Note: Most controls use the implicit size of the content item to calculate the implicit size of the control itself. If you replace the content item with a custom one, you should also consider providing a sensible implicit size for it (unless it is an item like Text which has its own implicit size).

您不想增大 ColumnLayout 以匹配 contentItem,contentItem 将自动调整大小以适应 ColumnLayout 的隐式大小。

如果您想要获得的效果是将 ColumnLayout 的大小与 ScrollView 的大小相匹配,则使用如下内容:

                    ColumnLayout{
                        id: colLayout
                        implicitWidth: scrollview.width
                        implicitHeight: scrollview.height
                        height: implicitHeight
                        width: implicitWidth
                    }

但既然如此,为什么还要费心使用 ScrollView?通常,您会允许 ColumnLayout 通常根据其子项管理其隐式大小。当 contentItem 溢出 ScrollView 时,它开始自动滚动。