百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术流 > 正文

Qt编程进阶(46):Anchor锚是什么?(qt编程先导篇)

citgpt 2024-07-12 09:50 12 浏览 0 评论

除前面介绍的Row、Column和Grid等外,QML还提供了一种使用Anchor(锚)来进行元素布局的方法。每个元素都可被认为有一组无形的“锚线”:left、horizontalCenter、right、top、verticalCenter和bottom,如下图所示。Text元素还有一个baseline锚线(对于没有文本的元素,它与top相同)。

这些锚线分别对应元素中的anchors.left、anchors.horizontalCenter等属性,所有的可视元素都可以使用锚来布局。锚系统还允许为一个元素的锚指定边距(margin)和偏移(offset)。边距指定了元素锚到外边界的空间量,而偏移允许使用中心锚线来定位。一个元素可以通过leftMargin、rightMargin、topMargin和bottomMargin来独立地指定错边距,如下图所示,也可以使用anchor.margins来为所有的4个铺指定相同的边距。

Qt编程进阶(46):Anchor锚是什么?(qt编程先导篇)

锚偏移使用horizontalCenterOffset、verticalCenterOffset和baselineOffset来指定。编程中还经常用anchors.fill将一个元素充满另一个元素,这等价于使用了4个直接的锚。但要注意,只能在父子或兄弟元素之间使用锚,而且基于锚的布局不能与绝对的位置定义(如直接设置x和y属性值)混合使用,否则会出现不确定的结果。

使用Anchor布局一组矩形元素,并测试锚的特性,布局运行效果如图所示。

具体实现步骤如下。

(1) 新建QML应用程序,项目名称为“Anchor”。

(2) 本文实例需要复用之前己开发的组件。

将前面文章实例中的源文件“Button.qml”、“RedRectangle.qml”、“GreenRectangle.qml”及“BlueRectangle.qml”复制到本项目目录下。右击项目视图“Resources” 一 “qml.qrc”下的“/’节点,选择“Add Existing Files...”项,弹出“Add Existing Files”对话框,选中上述几个.qml文件,单击“打开”按钮将它们添加到当前项目中。

(3) 打开“main.qml”文件,编写代码如下:

Bash
import QtQuick 2.12
import QtQuick.Window 2.12
Window {
  width: 320
  height: 240
  visible: true
  title: qsTr("Anchor")
  Rectangle {
    id: windowRect
    /*定义属性别名*/ // (a)
    property alias chgRect1: changingRect1 //矩形changingRect1属性别名
    property alias chgRect2: changingRect2 //矩形changingRect2属性别名
    property alias rRect: redRect //红矩形redRect属性别名
    width: 360
    height: 360
    anchors.fill: parent
    /* 使用Anchor对三个矩形元素进行横向布局 */ //(b)
    BlueRectangle { //蓝矩形
      id : blueRect
      anchors.left: parent.left //与窗口左锚线锚定
      anchors.top: parent.top //与窗口顶锚线锚定
      anchors.leftMargin: 25 //左锚边距(与窗口左边距)
      anchors.topMargin: 25 //顶锚边距(与窗口顶边距)
    }
    GreenRectangle { //绿矩形
      id:greenRect
      anchors.left: blueRect.right //绿矩形左锚线与蓝矩形的右锚线锚定
      anchors.top: blueRect.top //绿矩形顶锚线与蓝矩形的顶锚线锚定
      anchors.leftMargin: 40 //左锚边距(与蓝矩形的间距)
    }
    RedRectangle { //红矩形
      id:redRect
      anchors.left: greenRect.right //红矩形左锚线与绿矩形的右锚线锚定
      anchors.top: greenRect.top //红矩形顶锚线与绿矩形的顶锚线锚定
      anchors.leftMargin: 40 //左锚边距(与绿矩形的间距)
    }
    /*对比测试Anchor的性质*/ //(c)
    RedRectangle {
      id:changingRect1
      anchors.left: parent.left //矩形 changingRect1 初始与窗体左锚线锚定
      anchors.top: blueRect.bottom
      anchors.leftMargin: 25
      anchors.topMargin: 25
    }
    RedRectangle {
      id:changingRect2
      anchors.left: parent.left //changingRect2与 changingRect1 左对齐
      anchors.top: changingRect1.bottom
      anchors.leftMargin: 25
      anchors.topMargin: 20
    }
    /*复用按钮*/
    Button {
      width:95
      height:35 //(d)
      anchors.right: redRect.right
      anchors.top: changingRect2.bottom
      anchors.topMargin: 10
    }
  }
}

其中,

  • (a) /*定义属性别名*/:这里定义矩形changingRect1、changingRect2及redRect的别名,目的是在按钮组件的源文件(外部QML文档)中能访问这几个元素,以便测试它们的锚定特性。
  • (b) /* 使用Anchor对三个矩形元素进行横向布局 */:这段代码使用己定义的三个现成矩形元素,通过分别设置anchors.left、anchors.top、anchors.leftMargin、anchors.topMargin等锚属性,对它们进行从左到右的布局,这与之前介绍的Row的布局作用一样。读者还可以修改其他锚属性以尝试更多的布局效果。
  • (c) /*对比测试Anchor的性质*/:锚属性还可以在程序运行中通过代码设置来动态地改变,为了对比,本例设计使用两个相同的红矩形,初始它们都与窗体左锚线锚定(对齐),然后改变右锚属性来观察它们的行为。
  • (d) width:95; height:35:按钮组件原定义尺寸为“width: 100; height:62”,复用时可以重新定义它的尺寸属性以使程序界面更美观。新属性值会“覆盖”原来的属性值,就像面向对象的“继承”一样提高了灵活性。

(4)打开“Button.qml”文件,修改代码如下:

Bash
import QtQuick 2.0
Rectangle { //将Rectangle自定义成按钮
  id:btn
  width:100;height:62 //按钮的尺寸
  color: "teal" //按钮颜色
  border.color: "aqua" //按钮边界色
  border.width: 3 //按钮边界宽度
  Text { //Text元素作为按钮文本
    id: label
    anchors.centerIn: parent
    font.pointSize: 16
    text: "开始"
  }
  MouseArea { //MouseArea对象作为按钮单击事件响应区
    anchors.fill: parent
    onClicked: {//响应单击事件代码
      label.text = "按钮已按下!"
      label.font.pointSize = 11 //改变按钮文本和字号
      btn.color = "aqua" //改变按钮颜色
      btn.border.color = "teal" //改变按钮边界色
      /* 改变changingRect1的右锚属性 */ //(a)
      windowRect.chgRect1.anchors.left = undefined;
      windowRect.chgRect1.anchors.right = windowRect.rRect.right;
      /* 改变 changingRect2 的右锚属性 */ // (b)
      windowRect.chgRect2.anchors.right = windowRect.rRect.right;
      windowRect.chgRect2.anchors.left = undefined;
    }
  }
}

其中,

  • (a) /* 改变changingRect1的右锚属性 */:这里用“windowRect.chgRect1.anchors.left = undefined”先解除其左锚属性的定义,然后再定义右锚属性,执行后,该矩形便会移动到与redRect(第一行最右边的红矩形)右对齐。
  • (b) /* 改变 changingRect2 的右锚属性 */:这里先用“windowRect.chgRect2.anchors.right = windowRect.rRect.right”指定右锚属性,由于此时元素的左描属性尚未解除,执行后,矩形位置并不会移动,而是宽度自动“拉长”到与redRect右对齐,之后即使再解除左锚属性也无济于事,故用户在编程改变布局时,一定要先将元素的旧锚解除,新设置的锚才能生效!

鼠标点击按钮后如下图所示。

————————————————

觉得有用的话请关注点赞,谢谢您的支持!

对于本系列文章相关示例完整代码有需要的朋友,可关注并在评论区留言!

相关推荐

Linux系统中的sudo命令、APT软件包管理器以及Java开发工具包JDK

sudo命令详解:sudo命令允许用户以root权限执行命令,类似于Windows系统中的“以管理员身份运行”。这在需要系统级权限操作时非常有用。更多信息请参考:https://do...

js中arguments详解

一、简介了解arguments这个对象之前先来认识一下javascript的一些功能:其实Javascript并没有重载函数的功能,但是Arguments对象能够模拟重载。Javascrip中每个函数...

firewall-cmd 常用命令

目录firewalldzone说明firewallzone内容说明firewall-cmd常用参数firewall-cmd常用命令常用命令 回到顶部firewalldzone...

epel-release 是什么

EPEL-release(ExtraPackagesforEnterpriseLinux)是一个软件仓库,它为企业级Linux发行版(如CentOS、RHEL等)提供额外的软件包。以下是关于E...

FullGC详解  什么是 JVM 的 GC
FullGC详解 什么是 JVM 的 GC

前言:背景:一、什么是JVM的GC?JVM(JavaVirtualMachine)。JVM是Java程序的虚拟机,是一种实现Java语言的解释器。 它提供了一种独立于操作系统的运行环境,使得Java程序在任...

2024-10-26 08:50 citgpt

使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
跨域(CrossOrigin)

1.介绍  1)跨域问题:跨域问题是在网络中,当一个网络的运行脚本(通常时JavaScript)试图访问另一个网络的资源时,如果这两个网络的端口、协议和域名不一致时就会出现跨域问题。    通俗讲...

微服务架构和分布式架构的区别

1、含义不同微服务架构:微服务架构风格是一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,服务间通信采用轻量级通信机制(通常用HTTP资源API)。这些服务围绕业务能力构建并...

深入理解与应用CSS clip-path 属性
深入理解与应用CSS clip-path 属性

clip-pathclip-path是什么clip-path 是一个CSS属性,允许开发者创建一个剪切区域,从而决定元素的哪些部分可见,哪些部分会被隐藏。通过定义这个剪切路径(clippingpath),您可以创造出非矩形的裁剪...

2024-10-25 11:51 citgpt

HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
Redis和Memcached的区别详解
Redis和Memcached的区别详解

Redis的作者SalvatoreSanfilippo曾经对这两种基于内存的数据存储系统进行过比较:1.Redis支持服务器端的数据操作:Redis相比Memcached来说,拥有更多的数据结构和并支持更丰...

2024-10-25 11:51 citgpt

Request.ServerVariables 大全

Request.ServerVariables("Url")返回服务器地址Request.ServerVariables("Path_Info")客户端提供的路...

python操作Kafka

目录一、python操作kafka1.python使用kafka生产者2.python使用kafka消费者3.使用docker中的kafka二、python操作kafka细...

Runtime.getRuntime().exec详解

Runtime.getRuntime().exec详解概述Runtime.getRuntime().exec用于调用外部可执行程序或系统命令,并重定向外部程序的标准输入、标准输出和标准错误到缓冲池。...

promise.all详解 promise.all是干什么的
promise.all详解 promise.all是干什么的

promise.all详解promise.all中所有的请求成功了,走.then(),在.then()中能得到一个数组,数组中是每个请求resolve抛出的结果。promise.all中只要有一个失败了,走.catch(),在.catch(...

2024-10-24 16:21 citgpt

取消回复欢迎 发表评论: