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 时,它开始自动滚动。
以下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
.
更多信息在这里:
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 时,它开始自动滚动。