一个元素有 6 个主要的锚点的定位线,如下图所示:这 6 个定位线分别是:topbottomleftrighthorizontalCenterverticalCenter。对于Text元素,还有一个baseline锚点。每一个锚点定位线都可以结合一个偏移的数值。其中,topbottomleftright称为外边框;horizontalCenterverticalCenter和称为偏移量。

    下面,我们使用例子来说明这些锚点的使用。首先,我们需要重新定义一下上一章使用过的BlueRectangle组件:

    简单来说,我们在BlueRectangle最后增加了一个MouseArea组件。前面的章节中,我们简单使用了这个组件。顾名思义,这是一个用于处理鼠标事件的组件。之前我们使用了它处理鼠标点击事件。这里,我们使用了其拖动事件。anchors.fill: parent一行的含义马上就会解释;drag.target: parent则说明拖动目标是parent。我们的拖动对象是MouseArea的父组件,也就是BlueRectangle组件。

    接下来看第一个例子:

    QML anchors.fill

    代码如下:

    1.  
    2. Rectangle {
    3. id: root
    4. width: 220
    5. height: 220
    6. color: "black"
    7.  
    8. GreenRectangle {
    9. x: 10
    10. y: 10
    11. width: 100
    12. height: 100
    13. BlueRectangle {
    14. width: 12
    15. anchors.fill: parent
    16. anchors.margins: 8
    17. }
    18. }

    第二个例子:

    代码如下:

    这次,我们使用anchors.left设置内部蓝色矩形的锚点为父组件的左边线(parent.left);左边距是 8px。另外,我们可以试着拖动蓝色矩形,看它的移动方式。在我们拖动时,蓝色矩形只能沿着距离父组件左边 8px 的位置上下移动,这是由于我们设置了锚点的缘故。正如我们前面提到过的,锚点要比单纯地计算坐标改变的效果更强,更优先。

    第三个例子:QML anchors.left parent.right代码如下:

    1. import QtQuick 2.0
    2.  
    3. Rectangle {
    4. id: root
    5. width: 220
    6. height: 220
    7. color: "black"
    8.  
    9. GreenRectangle {
    10. x: 10
    11. y: 10
    12. width: 100
    13. height: 100
    14. BlueRectangle {
    15. width: 48
    16. anchors.left: parent.right
    17. }
    18. }

    这里,我们修改代码为anchors.left: parent.right,也就是将组件锚点的左边线设置为父组件的右边线。效果即如上图所示。当我们拖动组件时,依然只能上下移动。

    代码如下:

    这算是一个稍微复杂的例子。这里有两个蓝色矩形:blue1blue2。的锚点水平中心线设置为父组件的水平中心;blue2的锚点上边线相对于blue1的底部,其中边距为 4px,另外,我们还增加了一个水平中线为blue1的水平中线。这样,blue1相对于父组件,blue2相对于blue1,这样便决定了三者之间的相对关系。当我们拖动蓝色矩形时可以发现,blue1blue2的相对位置始终不变,因为我们已经明确指定了这种相对位置,而二者可以像一个整体似的同时上下移动(因为我们没有指定其中任何一个的上下边距与父组件的关系)。

    另外一个例子:代码如下所示:

    1. import QtQuick 2.0
    2.  
    3. Rectangle {
    4. id: root
    5. width: 220
    6. height: 220
    7. color: "black"
    8.  
    9. GreenRectangle {
    10. x: 10
    11. y: 10
    12. width: 100
    13. height: 100
    14.  
    15. BlueRectangle {
    16. width: 48
    17. anchors.centerIn: parent
    18. }
    19. }

    与第一个例子类似,我们使用的是anchors.centerIn: parent将蓝色矩形的中心固定在父组件的中心。由于我们已经指明是中心,所以也不能拖动这个蓝色矩形。

    最后一个例子:QML anchors.horizontalCenter verticalCenter

    代码如下:

    至此,我们简单介绍了 QML 中定位器和锚点的概念。看起来这些元素和机制都很简单,但是,通过有机地结合,足以灵活应对更复杂的场景。我们所要做的就是不断熟悉、深化对这些定位布局技术的理解。