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 是另一个便利锚点,它将垂直中心锚点设置为目标项的垂直中心,将水平中心锚点设置为目标项的水平中心。
锚点边距和偏移量
锚点系统还允许为项的锚点指定边距和偏移量。边距指定留空到项的锚点外面的空间量,而偏移量允许使用中心锚线来操作位置。项可以通过leftMargin、rightMargin、topMargin和bottomMargin分别指定其锚点边距,或使用anchors.margins为四个边指定相同的边距值。锚点偏移量使用horizontalCenterOffset、verticalCenterOffset和baselineOffset指定。
以下示例指定了左边距
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,则结果未定义,因为不清楚项目是否应该使用锚点或绝对定位。对于使用Row和Column等定位器设置项目x和y属性的情况也是如此。如果您希望从基于锚点的定位更改为绝对定位,可以通过将其设置为undefined
来清除锚点值。
在特定的Qt许可证下可用。
了解更多。