Qt 当中继器';s代理高度更改
我已经设置了一个名为test1.qml的文件,其中包含以下内容:Qt 当中继器';s代理高度更改,qt,qml,qt5.6,Qt,Qml,Qt5.6,我已经设置了一个名为test1.qml的文件,其中包含以下内容: import QtQuick 2.6 import QtQuick.Layouts 1.3 Rectangle { width: 800; height: 1000; ColumnLayout { anchors.centerIn: parent // Header goes here Repeater { model: 3
import QtQuick 2.6
import QtQuick.Layouts 1.3
Rectangle {
width: 800; height: 1000;
ColumnLayout {
anchors.centerIn: parent
// Header goes here
Repeater {
model: 3
delegate: MyRectangle {
width: 150
height: width
color: "#44ff0000"
}
}
// Footer goes here
}
}
import QtQuick 2.6
Rectangle {
MouseArea {
anchors.fill: parent
onClicked: {
parent.height += 50
}
}
}
我还设置了一个名为test2.qml的文件,定义如下:
import QtQuick 2.6
import QtQuick.Layouts 1.3
Rectangle {
width: 800; height: 1000;
ColumnLayout {
anchors.centerIn: parent
// Header goes here
Repeater {
model: 3
delegate: Column {
MyRectangle {
width: 150
height: width
color: "#44ff0000"
}
}
}
// Footer goes here
}
}
最后,MyRectangle.qml包含以下内容:
import QtQuick 2.6
import QtQuick.Layouts 1.3
Rectangle {
width: 800; height: 1000;
ColumnLayout {
anchors.centerIn: parent
// Header goes here
Repeater {
model: 3
delegate: MyRectangle {
width: 150
height: width
color: "#44ff0000"
}
}
// Footer goes here
}
}
import QtQuick 2.6
Rectangle {
MouseArea {
anchors.fill: parent
onClicked: {
parent.height += 50
}
}
}
我的目标是,当单击MyRectangle的实例时,它们的高度会发生变化,ColumnLayout应该放大,以便项目保持其间距
当我运行test.qml时,结果并不是我所期望的,因为MyRectangle的实例在单击时彼此重叠。但是,test2.qml给出了所需的行为,MyRectangle的实例在ColumnLayout增大时保持其间距
应derM的要求,我认为下面的GIF可能有助于更清楚地解释这一点
test1.qml的(非期望的)行为:
test2.qml的(所需)行为:
为什么我必须将对象包装在列中以获得所需的结果?原因可能听起来很奇怪:
[…]布局
-族不仅用于排列对象,还用于调整对象的大小。您不应该在其中设置或更改大小
要执行其工作,当您不使用可用的附加属性来设置大小时,它将使用项的隐式宽度/高度
如果尚未设置隐式尺寸标注,则在向布局添加新项目时,其隐式尺寸标注将设置为等于其设置的尺寸标注。但这不是一个约束!因此,如果现在更新高度
,则隐式高度
将保持原始大小,因此布局不会对更改做出反应
如果将列
添加到代理中,情况会发生变化:列
根据其子项的边界矩形更新其隐式权重
。如果现在调整矩形的高度,则列
将调整隐式高度
,而布局
将对更改作出反应
现在您有了以下解决方案:
使用Layout
attached属性设置和更改尺寸提示
使用代理的隐含高度
,而不是高度
。但这在语义上可能是错误的
当您不需要额外的布局功能(附加属性和项目大小调整等)时,不要使用列布局
,而只使用常规的列
,这似乎就是您的问题所在
中继器没有布局。当列或行布局中只有一个子对象时,为什么要使用它们作为委托?中继器只需创建多个委托实例,就可以为每个实例传递模型数据。布局可以通过将中继器放在代理将成为其父对象的布局中进行外部应用,也可以通过设置x和y值等方式来确定每个代理的位置。您的评论有意义,我最初尝试只使用一个矩形。然而,当我这么做的时候,我所有的东西都堆在了一起。将“height:myDelegate.height”添加到矩形中可以正确地布置代理,但是中继器(本身是ColumnLayout的一部分)没有获得正确的高度,并且中继器下面的项目被布置在其顶部。经过反复试验,我发现Column或ColumnLayout解决了我的问题。不过,我很想知道为什么矩形不能正常工作。请添加一个小图形,说明您到底想实现什么。我编辑了问题,添加了一些图形,希望能更清楚地解释我的问题。