【问题标题】:QtQuick - what is meant by "parent item"?QtQuick - “父项”是什么意思?
【发布时间】:2021-04-23 21:16:24
【问题描述】:

以下 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”的确切含义吗? 非常感谢。

【问题讨论】:

    标签: qt qml qtquick2


    【解决方案1】:

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

    更多信息在这里:

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

    另见那里的评论:

    注意:大多数控件使用内容项的隐式大小来计算控件本身的隐式大小。如果您将内容项替换为自定义项,您还应该考虑为其提供一个合理的隐式大小(除非它是像 Text 这样具有自己隐式大小的项)。

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

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

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

    但在这种情况下,为什么还要使用 ScrollView?通常,您将允许 ColumnLayout 根据其子项正常管理其隐式大小。当 contentItem 最终溢出 ScrollView 时,它开始自动滚动。

    【讨论】:

    • ScrollView的情况下,我相信contentItem没有被使用。默认属性是contentData
    • 不同的默认属性并没有改变他们仍然是contentItem的孩子这一事实。
    • 你是对的,我的错。 contentData 只是一个对象列表,而不是一个项目。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 2017-06-11
    • 2018-03-05
    • 2023-03-27
    相关资源
    最近更新 更多