以下代码有两个问题。
如果我在 QML 列中使用填充,我会收到以下消息:
QML Column: possible QQuickItem::polish() loop
并且应用程序变得无响应。另外,如果我不使用 anchor ,则不会出现问题,但列内的矩形不会被拉伸(stretch)。
如果我使用 anchor ,列的隐式宽度和隐式高度将为零,这将导致矩形不会显示。
Qt 文档是这样说的:
Also, since a Column automatically positions its children vertically, a child item within a Column should not set its y position or vertically anchor itself using the top, bottom, anchors.verticalCenter, fill or centerIn anchors.
这意味着不禁止水平锚定(左/右)。
知道可能出了什么问题吗?
Rectangle {
anchors.fill: parent
color: "green"
Rectangle {
anchors.centerIn: parent
implicitWidth: col.implicitWidth
implicitHeight: col.implicitHeight
color: "blue"
Column {
spacing: 10
//padding: 10 // causes: QML Column: possible QQuickItem::polish() loop
id: col
Rectangle {
anchors.left: parent.left
anchors.right: parent.right
implicitWidth: 100
implicitHeight: 25
}
Rectangle {
//anchors.left: parent.left // uncommenting these anchors will result that the column's implicitWidth and implicitHeight will be 0
//anchors.right: parent.right
implicitWidth: 200
implicitHeight: 25
}
Component.onCompleted: console.log("column, imp width: " + implicitWidth + ", imp height: " + implicitHeight)
}
}
}
最佳答案
正如评论中所讨论的,Ponzifex
的代码可以改进:
删除重定父级并创建一个新的默认属性别名,如下所示:
Rectangle
{
default property alias data2: col.data
data:
[
Column
{
id: col;
onChildrenChanged: { ...calculate sizes, add bindings, etc... }
}
]
}
这是如何工作的:
- 当在 QML 代码中将对象嵌套在另一个对象中时,您将它们添加到父对象内标记为
default
的属性 - 对于
Item
以及Rectangle
,名为data
的属性被标记为default
- 该属性包含
Item
/Rectangle
的可视子项和资源的组合列表 - 因此,通常在
Rectangle
中嵌套视觉元素会导致它们被添加为Rectangle
的视觉子元素 - 通常
矩形 { Text {};计时器{} }
... - ...相当于:
矩形 { data: [ Text {}, Timer{} ] }
- 该属性包含
- 我通过创建一个名为
data2
的新属性并将其设置为Rectangle
的default
来更改这一点data2
与data
无关,因此它的元素不会添加到Rectangle
的可视子级列表- 相反,我将
data2
设为Column
的data
属性的别名 alias
属性就是 - 别名 - 属性的另一个名称,在本例中 - 作为另一个对象的属性 - 但两个名称都“指向”同一个实际属性,因此列
的视觉子级列表- 因此,嵌套在
Rectangle
内的所有 QML 元素都将添加为Column
的可视子元素
- 但是,现在我遇到了一个问题:我不能在 QML 代码中将
Column
嵌套到Rectangle
中,因为这意味着Column
需要添加为它自己的 child (这没有意义)- 因此,我必须分配
Rectangle
的实际data
属性(该属性不再是默认值,因此我必须明确写入其名称),从而添加Column
作为矩形
的可视子级
- 因此,我必须分配
- 现在,每当添加或删除
Rectangle
的嵌套元素(包括通过Repeater
)时,Column
的数据
属性发生变化,但由于我们添加了可视子元素,children
属性也会发生变化- 因此,当
Column
的onChildrenChanged
信号触发时,我们可以触发重新计算和重新绑定(bind)(如果您还想在非特定情况下触发,则触发onDataChanged
)视觉 child 又名资源
) - 您可以跳过已绑定(bind)的元素或重新绑定(bind)它们
- 因此,当
据我所知,这应该是有效且受支持的 QML 语法 - 只是不是您通常使用的语法 - 因此可以在生产代码中使用它,也许可以用注释解释正在发生的情况
关于qt - QML 列:可能的 QQuickItem::polish() 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66303743/