qml-2 定位

 xyz布局定位

继承体系  Button ->AbstractButton->Control->Item->QQuickItem

介绍:The QQuickItem class provides the most basic of all visual items in Qt Quick

属性:

x : qreal

Defines the item's x position relative to its parent.相对于父类的x

Access functions:

qreal

x() const

void

setX(qreal)

y : qreal       

Defines the item's y position relative to its parent.   相对于父类的y

Access functions:

qreal

y() const

void

setY(qreal)

z : qreal

Sets the stacking order of sibling items. By default the stacking order is 0.

Items with a higher stacking value are drawn on top of siblings with a lower stacking order. Items with the same stacking value are drawn bottom up in the order they appear. Items with a negative stacking value are drawn under their parent's content.

The following example shows the various effects of stacking order.

设置同级项的堆叠顺序。 默认情况下,堆叠顺序为 0。

具有较高堆叠值的项目被绘制在具有较低堆叠顺序的同级之上。 具有相同堆叠值的项目按照它们出现的顺序自下而上绘制。 具有负堆叠值的项目被绘制在其父项的内容下。

以下示例显示了堆叠顺序的各种效果。

属性绑定

        在qml中可以为对象的属性分配一个静态值,该值保持不变,直到为它显式分配一个新值为止。但是,为了充分利用QML及其对动态对象行为的内置支持,大多数QML对象都使用属性绑定。

        属性绑定是QML的一项核心功能,可让开发人员指定不同对象属性之间的关系。当属性的依赖项的值更改时,该属性将根据指定的关系自动更新。

        在后台,QML引擎监视属性的依赖关系(即绑定表达式中的变量)。检测到更改时,QML引擎将重新计算绑定表达式并将新结果应用于属性。

例子:

拖拽btn时候,让Rectangle跟着移动

import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.0


Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")

    Button{
        id:btn1
        x:0
        y:0
        text:"click"
        onClicked: {
            rect1.color="red"
        }

        //鼠标区域
        MouseArea{
        anchors.fill: parent
        drag.target: btn1
        }
    }

    Rectangle {
        id:rect1
        color: "blue"
        width: 100
        height: 100
        x: btn1.x
        y: btn1.y + btn1.height

    }
}

 将Rectangle的 坐标 x y 绑定 btn1.x  y ;当btn1的坐标发生变化时,其坐标跟着动态变化

锚点布局

定义在Item中

         锚点提供了一种通过指定项目与其他项目的关系来定位项目的方法。
        边距适用于顶部、底部、左侧、右侧和填充锚点。 anchors.margins 属性可用于一次将所有不同的边距设置为相同的值。 它不会覆盖先前设置的特定边距; 要清除显式边距,请将其值设置为未定义。 请注意,边距是特定于锚点的,如果项目不使用锚点,则不会应用边距。
偏移量适用于水平中心、垂直中心和基线锚点。

    
        要清除锚值,请将其设置为未定义。
        anchors.alignWhenCentered(默认为 true)强制居中的锚点对齐到整个像素; 如果居中的项目具有奇数宽度或高度,则项目将定位在整个像素上,而不是放置在半像素上。 这确保了项目被清晰地绘制。 在某些情况下这是不可取的,例如当旋转项目时,由于中心是圆形的,抖动可能很明显。

anchors.fill

         anchors.fill 为一个 item 与另一个 item (只是qobject即可)具有相同的几何图形提供了一种便捷的方式,相当于连接了所有四个定向锚点。

        如:将Rectangle 区域填充满整个窗口

anchors.right

一种错误的写法:Window并不是继承Item 而是继承QQuickWindow 因此不能这么用。正确写法:

解决Qml的Window控件不能使用id进行布局定位的问题:Window窗口的根Item被附加在contentItem上。如下写法即可:

         

anchors.top 

 demo练习

import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.0


Window {
    id:root
    width: 400
    height: 300
    visible: true
    title: qsTr("Hello World")


    Item{
      anchors.fill: parent

      Rectangle{
          id:rect1

          color: 'green'
          width: parent.width/3   //宽度是父类的1/3
          anchors.top:parent.top   //高度与父类 相同
          anchors.bottom: parent.bottom
      }

      Rectangle{
          id:rect2

          color: 'red'
          width: parent.width/3   //宽度是父类的1/3
          anchors.top:parent.top   //高度与父类 相同
          anchors.bottom: parent.bottom
          anchors.left: rect1.right
      }


      Rectangle{
          id:rect3

          color: 'black'
          width: parent.width/3   //宽度是父类的1/3
          anchors.top:parent.top   //高度与父类 相同
          anchors.bottom: parent.bottom
          anchors.left: rect2.right        //在rect2 的右边
      }

    }


}

 布局

行列布局

 Flow

        Flow 项目将其子项目定位为页面上的单词,包装它们以创建项目的行或列。

        如果 Flow 中的某个 item 不可见,或者它的宽度或高度为 0,则该 item 将不会被布局并且在 Flow 中将不可见。 此外,由于 Flow 会自动定位其子项,因此 Flow 中的子项不应设置其 x 或 y 位置或使用任何锚属性锚定自身。

 注意:通常需要设置Flow的宽度高度来实现item的换行,比如这里使用了锚点;如果不设置,会超出窗口外面

网格布局

        如果调整 GridLayout 的大小,则布局中的所有项目都将重新排列。 它类似于基于小部件的 QGridLayout。 GridLayout 元素的所有可见子元素都将属于该布局。 如果你想要一个只有一行或一列的布局,你可以使用 RowLayout 或 ColumnLayout。 这些提供了更方便的 API,并提高了可读性。
        默认情况下,项目将根据流属性进行排列。 流属性的默认值为 GridLayout.LeftToRight。
如果指定了 columns 属性,它将被视为布局可以有多少列的最大限制,然后自动定位回到下一行的开头。 columns 属性仅在 flow 为 GridLayout.LeftToRight 时使用。

 通常不使用GirdLayout ,当设置的行数小于实际排布需要的行数,设置无效,如:

Gird:

        Grid 是一种以网格形式定位其子项的类型。
        Grid 创建一个足够大的单元格网格以容纳其所有子项,并将这些项从左到右和从上到下放置在单元格中。 每个项目都位于其单元格的左上角,位置为 (0, 0)。
        Grid 默认为四列,并根据需要创建尽可能多的行以适合其所有子项。 可以通过设置 rows 和         columns 属性来限制行数和列数。
例如,下面是一个 Grid,其中包含五个不同大小的矩形:

如果 Grid 中的某个项目不可见,或者它的宽度或高度为 0,则该项目将不会被布置并且在列中将不可见。 此外,由于 Grid 会自动定位其子项,因此 Grid 中的子项不应设置其 x 或 y 位置或使用任何锚属性锚定自身。
有关使用 Grid 和其他相关定位器类型的更多信息,请参阅项目定位器。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QML编程中,定位器(Positioner)是一种用于简化元素布局的工具。它可以帮助我们确定元素的位置,并且可以与锚点(Anchors)一起使用来定义元素的相对位置。定位器可以通过行列和网格定位的方式来布局元素。 在使用定位器进行布局时,我们可以通过设置元素的索引来确定其位置。例如,我们可以使用Repeater来重复创建一组矩形,并通过设置矩形的颜色和文本来演示定位器的使用。 在引用中的示例中,我们使用了Grid来创建一个16个矩形的网格布局。每个矩形的颜色根据其在网格中的位置而变化,第一个矩形为红色,其他矩形为蓝色。同时,每个矩形中心的文本显示了其在网格中的索引。 在引用中的示例中,我们同样使用了Grid来创建一个16个矩形的网格布局,但这次我们将最后一个矩形的颜色设置为红色,其他矩形仍为蓝色。同样,每个矩形中心的文本显示了其在网格中的索引。 通过使用定位器和锚点,我们可以更加方便地对元素进行布局和定位,使代码更加简洁和易于管理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Qt-qml元素布局](https://blog.csdn.net/u011555996/article/details/122004144)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [第39篇 QML类型:Positioner](https://blog.csdn.net/fanjufei123456/article/details/123085680)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值