C

使用锚点定位

除了更传统的 ,Qt Quick 还通过锚点概念提供了一种布局项的方法。每个项都可以看作是一组7条不可见的“锚线”:水平中心垂直中心基线

基线(如图中未显示)对应于文本将放置的假想线。对于没有文本的项,它与相同。

Qt Quick Ultralite 锚点系统允许您定义不同项的锚线之间的关系。例如,您可以编写

Rectangle { id: rect1; ... }
Rectangle { id: rect2; anchors.left: rect1.right; ... }

在这种情况下,rect2 的左边与 rect1 的右边绑定,生成以下结果

您可以指定多个锚点。例如

Rectangle { id: rect1; ... }
Rectangle { id: rect2; anchors.left: rect1.right; anchors.top: rect1.bottom; ... }

通过指定多个水平或垂直锚点,您可以控制项的大小。在下面的示例中,rect2 锚定在 rect1 的右边和 rect3 的左边。如果移动任一蓝色矩形,rect2 将根据需要拉伸和收缩

Rectangle { id: rect1; x: 0; ... }
Rectangle { id: rect2; anchors.left: rect1.right; anchors.right: rect3.left; ... }
Rectangle { id: rect3; x: 150; ... }

还有一些便利的锚点。anchors.fill 是一个便利选项,其效果与将左、右、顶和底锚点设置为目标的左、右、顶和底相同。anchors.centerIn 是另一个便利锚点,它将垂直中心锚点设置为目标项的垂直中心,将水平中心锚点设置为目标项的水平中心。

锚点边距和偏移量

锚点系统还允许为项的锚点指定边距偏移量。边距指定留空到项的锚点外面的空间量,而偏移量允许使用中心锚线来操作位置。项可以通过leftMarginrightMargintopMarginbottomMargin分别指定其锚点边距,或使用anchors.margins为四个边指定相同的边距值。锚点偏移量使用horizontalCenterOffsetverticalCenterOffsetbaselineOffset指定。

以下示例指定了左边距

Rectangle { id: rect1; ... }
Rectangle { id: rect2; anchors.left: rect1.right; anchors.leftMargin: 5; ... }

在这种情况下,在rect2的左侧预留了5像素的边距,产生以下效果:

注意:锚点边距仅适用于锚点;它们不是给Item应用边距的通用方法。如果为边指定了锚点边距,但项目没有锚定在该边的任何项目上,则不应用边距。

更改锚点

Qt Quick Ultralite提供了AnchorChanges类型来指定状态中的锚点。

State {
    name: "anchorRight"
    AnchorChanges {
        target: rect2
        anchors.right: parent.right
        anchors.left: undefined  //remove the left anchor
    }
}

由于绑定评估顺序未定义,不建议通过条件绑定更改锚点,因为这可能导致上述描述的顺序问题。在以下示例中,矩形最终会扩展到其父级的全宽度,因为在绑定更新期间同时设置了左和右锚点。

//bad code
Rectangle {
    width: 50; height: 50
    anchors.left: state == "right" ? undefined : parent.left;
    anchors.right: state == "right" ? parent.right : undefined;
}

应该重写为使用AnchorChanges,因为AnchorChanges将自动在内部处理顺序问题。

限制条件

出于性能原因,您只能将项目锚定到其兄弟和直接父项。例如,以下锚点无效,会产生警告

//bad code
Item {
    id: group1
    Rectangle { id: rect1; ... }
}
Item {
    id: group2
    Rectangle { id: rect2; anchors.left: rect1.right; ... }    // invalid anchor!
}

此外,基于锚点的布局不能与绝对定位混合。如果项目指定了其x位置并设置了anchors.left,或者锚定了其左和右边缘并额外设置了width,则结果未定义,因为不清楚项目是否应该使用锚点或绝对定位。对于使用RowColumn等定位器设置项目xy属性的情况也是如此。如果您希望从基于锚点的定位更改为绝对定位,可以通过将其设置为undefined来清除锚点值。

在特定的Qt许可证下可用。
了解更多。