我有一个Flow布局,我可以动态地在用户操作上添加项目。以同样的方式我删除用户操作上的这些项目。在删除项目之前,Flow QML组件似乎按预期工作。项目本身已被删除,但它占用的空间只是空白。我的直觉告诉我图形项本身已被删除,但删除项目时视图不会更新。
动态删除子项目是否超出流程组件的范围?是否有其他任何布局表现相同? GridLayout似乎是最接近的,但在调整布局大小时它不会自动换行子项。
是否有任何非黑客方法可以在禁用子项时启用Flow重新排列?如果没有,如果GridLayout是我最好的镜头,如何使它像Flow一样包装它的子项呢?
下面的代码演示了我想要实现的目标:
Item {
id: root
Flow {
id: layout
anchors.fill: parent
Loader { id: loader }
}
MouseArea {
anchors.top: parent.top
height: parent.height / 2
width: parent.width
onClicked: loader.source = "SomeQmlComponent.qml"
}
MouseArea {
anchors.bottom: parent.bottom
height: parent.height / 2
width: parent.width
onClicked: loader.source = ""
}
}
答案 0 :(得分:1)
请勿在{{1}}内使用Loader
。在您的情况下,项目是Flow
的父级,而不是Loader
,因此您将失去所有优势。以正常方式添加和删除项目没有问题:
Flow
答案 1 :(得分:0)
@folibis-感谢您的回答,它为我解决了一个问题,即我试图解决的问题是动态添加元素并使它们在屏幕上调整大小。我以您的示例为例,使矩形填充宽度,并用矩形的高度填充高度,使矩形的高度均匀。因此,随着矩形的数量缩小/扩展。为了简单起见,我将其缩小为4个矩形,并随机删除了一个矩形。
Component {
id: element
Rectangle {
width: flow.width
height: flow.height/flow.children.length
color: Qt.rgba(Math.random(),Math.random(),Math.random(),1)
}
}
Flow {
id: flow
spacing: 2
anchors.fill: parent
add: Transition {
NumberAnimation { properties: "x,y"; easing.type: Easing.OutBack }
}
move: add
}
Timer {
id: timer
property bool is_add: true
interval: 1000
repeat: true
running: true
onTriggered: {
if(timer.is_add) {
element.createObject(flow);
if(flow.children.length > 3) {
timer.is_add = false;
}
} else {
var i = Math.floor(Math.random() * Math.floor(flow.children.length ));
console.log(i)
var item = flow.children[i];
item.destroy();
if(flow.children.length <= 1) {
timer.is_add = true;
}
}
}
}