QtQuick布局边距

时间:2016-12-26 09:52:28

标签: qt layout qml qtquick2 qt-quick

有没有办法删除QML Layout组件中的开始和结束边距?

这是一个包含几个孩子的ColumnLayout示例。问题是如何删除那些顶部和底部边距并沿着父布局的整个高度重新分配所有子节点。

Margins

ColumnLayout {
    id: dotColumn
    anchors.horizontalCenter: bg.horizontalCenter
    height: root.height
    Repeater {
        id: repeater
        model: root.model

        Item {
            id: activeDot_container

            property int radius: 15
            width: radius * 2
            height: radius * 2

            Rectangle {
                anchors.centerIn: parent
                radius: parent.radius

                width: radius * 2
                height: radius * 2

                color: Palette.colors['deepPurple']['500']
            }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

经过几次布局定位实验后,我得到了以下解决方案。

假设我要消除的边距大小为布局子节点间距的一半,我们可以将负边距设置为布局组件的开头和结尾,将其拉伸到第一个,最后一个子节点在布局的开始/结束时对齐

我用来计算边距的函数:

function getMargin() {
  var height = root.height;
  var spacing = (height - root.radius * 2 * model.length) / model.length;
  return spacing / 2;
}

其中root是布局组件的父级,root.radius*2表示布局子项的大小,可以替换为另一个子维,model.length代表子计数。

然后我们可以为Layout组件设置锚点并设置相应的边距。

ColumnLayout {
    anchors.top: root.top
    anchors.bottom: root.bottom
    anchors.topMargin: -1 * getMargin()
    anchors.bottomMargin: -1 * getMargin()
    Repeater {
        model: root.model
        Item {
            property int radius: root.radius
            width: radius * 2
            height: radius * 2
            /* more code */
        }
    }
}

P.S。通过用左/右替换布局顶部/底部锚点,可以将相同的解决方案应用于RowLayout。

答案 1 :(得分:0)

您无法将布局内的项目对齐到顶部和底部。作为一种解决方法,您可以将带有变量y的项放在容器中,如下所示:

Window {
    visible: true
    visibility: Window.Maximized

    ColumnLayout {
        anchors.horizontalCenter: parent.horizontalCenter
        height: parent.height
        spacing:1
        Repeater {
            id: repeater
            model: 10
            Rectangle {
                color: "green"
                property int radius: 15
                width: radius
                Layout.fillHeight: true
                Rectangle {
                    anchors.horizontalCenter: parent.horizontalCenter
                    y: index * (parent.height - height) / (repeater.count - 1)
                    radius: parent.radius
                    width: radius * 2
                    height: radius * 2
                    color: "blue"
                }
            }
        }
    }
}