删除项目后,可以更新/刷新Flow QML组件吗?

时间:2017-01-24 18:35:16

标签: qt layout qml qtquickcontrols2

我有一个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 = ""
    }
}

2 个答案:

答案 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;
                    }
                }
            }
        }