上章我们学习了:12.Quick QML-QML 布局(Row、Column、Grid、Flow和嵌套布局) 、Repeater对象,本章我们继续来学习布局管理器

1.RowLayout、ColumnLayout、GridLayout布局管理器介绍

RowLayout、ColumnLayout、GridLayout布局管理器和Row、Column、Grid布局器非常相似,但是在布局管理器里就不支持使用Positioner附加属性了.
并且在布局器的基础上,为每个item提供了下面几个附加属性:

  • Layout.minimumWidth
  • Layout.minimumHeight
  • Layout.maximumWidth
  • Layout.maximumHeight
  • Layout.preferredWidth  : 首选宽度。如果未设置,那么布局将使用隐式宽度(implicitWidth)。默认值为-1。
  • Layout.preferredHeight : 首选高度。如果未设置,那么布局将使用隐式高度。默认值为-1。
  • Layout.fillWidth :  bool类型,默认为false,如果为true,那么该item的宽度会尽可能宽(可以伸缩),如果为false,那么宽度的优先级选择为: Layout.preferredWidth > implicitWidth > Layout.minimumWidth
  • Layout.fillHeight :  和Layout.fillWidth一样,设置高度是否可以伸缩
  • Layout.alignment : 设置item在网格里的对齐方式,默认值为" Qt.AlignVCenter | Qt.AlignLeft "
  • Layout.margins : 设置item的外边距
  • Layout.leftMargin
  • Layout.rightMargin
  • Layout.topMargin
  • Layout.bottomMargin

由于RowLayout和ColumnLayout其实本质就是单行或者单列的GridLayout.所以我们以GridLayout为例讲解.

2. GridLayout布局管理器介绍
它的属性如下所示:

  • rowSpacing : real,设置每行的间隔,默认值为5
  • columnSpacing : real,设置每列的间隔,默认值为5
  • rows : int,默认值为-1,用来设置网格有多少行
  • columns : int,默认值为-1,用来设置网格有多少列
  • flow : enumeration,流布局,取值有:
    • GridLayout.LeftToRight: 从左往右排列,如果剩余的宽度不足,则排下一行(默认值)
    • Flow.TopToBottom: 从上往下排列,如果剩余的宽度不足,则排下一列.
  • layoutDirection : enumeration,布局方向,取值有:
    • Qt.LeftToRight (default) : 默认方向
    • Qt.RightToLeft : 左右取反方向(比如布局顺序为123,将会变为321)

并且GridLayout在RowLayout和ColumnLayout的附加属性基础上,还额外增加了下面几个附加属性:

  • Layout.row : 指定item在网格中的行位置。默认值为0,由布局为项目自动分配单元格。
  • Layout.column: 指定item在网格中的列位置。默认值为0,由布局为项目自动分配单元格。
  • Layout.rowSpan : 指定item在网格中的行跨度,默认值为1。
  • Layout.columnSpan : 指定item在网格中的列跨度,默认值为1。

3.flow 和layoutDirection介绍
flow表示每个网格的排列方向.
layoutDirection表示布局方向,如果layoutDirection = Qt.RightToLeft,那么就会将水平方向的排列进行水平镜像.
比如默认显示的是:

设置layoutDirection = Qt.RightToLeft后,那么显示的将会是:

示例代码如下所示:

Window {
width: 320;
height: 240;
visible: true; GridLayout{
id: grid
rows: 3
flow: GridLayout.LeftToRight
layoutDirection: Qt.LeftToRight
anchors.fill: parent
Repeater {
model: 3
Rectangle {
color: "yellow"
Layout.alignment: Qt.AlignLeft // 水平靠左
Layout.fillHeight: true // 设置高度可伸缩
Layout.preferredWidth: 40
Layout.preferredHeight: 70
Text {
anchors.centerIn: parent
font.pixelSize: 14
text: "水平靠左"+index
}
Component.onCompleted: { console.log(Layout.row +","+ Layout.column) }
}
} Repeater {
model: 3
Rectangle {
Layout.alignment: Qt.AlignVCenter | Qt.AlignRight
color: "green"
Layout.fillHeight: true // 设置高度可伸缩
Layout.preferredWidth: 40
Layout.preferredHeight: 70
Text {
anchors.centerIn: parent
font.pixelSize: 14
text: "水平靠右"+index
}
}
}
} }

设置"flow: GridLayout.LeftToRight"、"layoutDirection: Qt.LeftToRight"的时候,效果如下所示:

设置"flow: GridLayout.LeftToRight"、"layoutDirection: Qt.RightToLeft"的时候,效果如下所示(水平方向取反,原来的顺序是012,变成了210,并且每个item的水平对齐方向也取反了):

设置"flow: GridLayout.TopToBottom"、"layoutDirection: Qt.LeftToRight"的时候,效果如下所示:

设置"flow: GridLayout.TopToBottom"、"layoutDirection: Qt. RightToLeft"的时候,效果如下所示(先绘制一列"yellow"、再绘制一列"green",然后再进行水平镜像变换):

4.Layout.rowSpan和Layout.columnSpan介绍
用来指定item在网格中显示的行跨度和列跨度,默认值为1.
我们以每个网格的宽高为1为例,比如当前item默认显示的区域是在(0,1)~(1,2)上:

000
X00
000

如果我们设置columnSpan=3, rowSpan=2,那么当前item显示的区域将是在(0,1)~(3,3)上面,也就是说列跨度(宽度)占了3个网格,行宽度(高度)占了2个网格,将会变为:

000
XXX
XXX
  • 注意 : 使用跨度之前,必须设置Layout.fillWidth和Layout.fillHeight为true

示例如下所示:

Window {
width: 320;
height: 240;
visible: true; GridLayout{
id: grid
columns: 3
anchors.fill: parent Repeater {
model: 3
Rectangle { // 显示区域
color: "green"
Layout.fillWidth: true
Layout.fillHeight: true
} }
Rectangle { // 显示区域
color: "steelblue"
Layout.fillWidth: true
Layout.fillHeight: true
Layout.columnSpan: 3
Layout.rowSpan: 2
}
}
}

效果如下所示:

注意:

Layout.rowSpan和Layout.columnSpan有个bug,那就是如果我们定义的某一列的所有item如果都带了Layout.columnSpan值,那么是没有效果的,示例如下所示:

GridLayout{
id: grid
columns: 4
anchors.fill: parent Rectangle {
color: "steelblue"
Layout.fillWidth: true
Layout.fillHeight: true
}
Rectangle {
color: "steelblue"
Layout.fillWidth: true
Layout.fillHeight: true
}
Rectangle { // yellow区域
color: "yellow"
Layout.fillWidth: true
Layout.fillHeight: true
Layout.columnSpan: 2
}
Rectangle {
color: "steelblue"
Layout.fillWidth: true
Layout.fillHeight: true
Layout.columnSpan: 2
}
Rectangle { // yellow区域
color: "yellow"
Layout.fillWidth: true
Layout.fillHeight: true
Layout.columnSpan: 2
}
}

效果如下所示:

可以看到我们设置yellow块的是Layout.columnSpan: 2,但是显示的效果并没有跨列.这是因为我们最后一列没有放置任何东西,所以它的位置被前面3列给均匀平摊了.

5.简易的网站导航界面设计
接下来我们便来通过GridLayout来做一个简易的网站导航界面,并支持自适应界面.当我们点击其中的某个按钮,就会打开浏览器跳到对应的网站上.
界面如下所示:

首先创建BoxButton组件:

import QtQuick 2.14
import QtQuick.Controls 2.0 Button {
id: btn
property var backColor: "#7BCBEB" // 背景颜色
property var iconUrl: "" // 图标
property var textSize: 12 // 图标
property var openUrl: "" // 链接 text: "button"
implicitWidth: 60
implicitHeight: 60
hoverEnabled: true
contentItem: Label { // 设置文本,文本位于左下角
id: btnForeground
text: parent.text
font.family: "Microsoft Yahei"
font.pixelSize: textSize
color: "#FFFFFF"
horizontalAlignment: Text.AlignLeft
verticalAlignment: Text.AlignBottom
}
background: Rectangle { // 设置背景色
id: btnBack
color: backColor
border.color: backColor
border.width: 2 } Image{ // 设置图标,图标位于右上角
source: iconUrl
anchors.right: parent.right
anchors.top: parent.top
smooth: true
anchors.rightMargin: parent.width * 0.01
anchors.topMargin: parent.height * 0.03
fillMode: Image.PreserveAspectFit
height: parent.height * 0.4
width: parent.width * 0.8
mipmap: true
} onDownChanged: {
btnBack.color = down ? Qt.lighter(backColor, 0.9) : backColor // 设置按下的背景颜色
btnBack.border.color = backColor
}
onHoveredChanged: {
btnBack.color = hovered ? Qt.lighter(backColor, 1.09) : backColor // 设置徘徊的背景颜色
btnBack.border.color = hovered ? Qt.lighter(backColor, 1.24) : backColor } onClicked: {
if (openUrl.length > 0) {
Qt.openUrlExternally(openUrl);
} }
}

然后在main.cpp来生成组件:

import QtQuick 2.14
import QtQuick.Window 2.0
import QtQuick.Layouts 1.14
Window {
width: 550;
height: 400;
visible: true;
color: "#506168" property var btnTextSize: Math.min(grid.height,grid.width) * 0.04 function boxButtonInit(item,color,text,icon,url) {
item.Layout.fillWidth = true
item.Layout.fillHeight = true
item.backColor = color
item.text = text
item.iconUrl = icon
item.openUrl = url } GridLayout{
id: grid
columns: 4
anchors.fill: parent
anchors.margins: 15
rowSpacing: 8
columnSpacing: 8
BoxButton {
textSize : btnTextSize
Component.onCompleted: boxButtonInit(this,
"#297FEC",
"号码归属地",
"qrc:/phone.png",
"https://www.ip138.com/sj/");
}
BoxButton {
textSize : btnTextSize
Component.onCompleted: boxButtonInit(this,
"#5B39B4",
"在线翻译",
"qrc:/translate.png",
"https://fanyi.baidu.com/");
}
BoxButton {
textSize : btnTextSize
Component.onCompleted: boxButtonInit(this,
"#00991A",
"百度一下",
"qrc:/baidu.png",
"https://www.baidu.com/");
}
BoxButton {
textSize : btnTextSize
Component.onCompleted: boxButtonInit(this,
"#C4204C",
"Google",
"qrc:/google.png",
"https://www.google.cn/");
}
BoxButton {
Layout.columnSpan: 2
textSize : btnTextSize
Component.onCompleted: boxButtonInit(this,
"#D74E2C",
"淘宝购物",
"qrc:/tb.png",
"https://www.taobao.com/"); }
BoxButton {
Layout.columnSpan: 2
Layout.rowSpan: 2
textSize : btnTextSize
Component.onCompleted: boxButtonInit(this,
"#297FEC",
"爱奇艺",
"qrc:/aiyiqi.png",
"https://www.iqiyi.com/");
} BoxButton {
textSize : btnTextSize
Component.onCompleted: boxButtonInit(this,
"#4CC8EF",
"新浪微博",
"qrc:/weibo.png",
"https://weibo.com/");
}
BoxButton {
textSize : btnTextSize
Component.onCompleted: boxButtonInit(this,
"#2B965E",
"京东商城",
"qrc:/jd.png",
"https://www.jd.com/");
}
} }

13.Quick QML-RowLayout、ColumnLayout、GridLayout布局管理器介绍、并通过GridLayout设计的简易网站导航界面的更多相关文章

  1. 编写Java程序,使用Swing布局管理器和常用控件,实现仿QQ登录界面

    返回本章节 返回作业目录 需求说明: 使用Swing布局管理器和常用控件,实现仿QQ登录界面 实现思路: 创建登录界面的类QQLogin,该类继承父类JFrame,在该类中创建无参数的构造方法,在构造 ...

  2. 第13章 Swing程序组件----常用布局管理器

    在Swing中,每个组件在容器中都有一个具体的位置和大小,而在容器中摆放各种组件时很难判断其具体位置和大小.布局管理器提供了Swing组件安排.展示在容器中的方法及基本的布局功能. Swing提供的常 ...

  3. Swing布局管理器介绍

    创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://zhangjunhd.blog.51cto.com/113473/128174 当选 ...

  4. learning java AWT 布局管理器 GridLayout

    GridLayout布局管理器将容器分割成纵横线分格的网格,每个网格所占的区域大小相同. import java.awt.*; public class GridLayoutTest { public ...

  5. java 图形化小工具Abstract Window Toolit ;布局管理器FlowLayout流式布局;BorderLayout边界布局;GridLayout网格布局;CardLayou重叠卡片布局;BoxLayout方框布局;绝对定位

    1.FlowLayout流式布局管理器: FlowLayout布局管理器中,组件像水流一样向某方向流动(排列),遇到障碍(边界)就折回,重头开始排列 .在默认情况下,FlowLayout局管理器从左向 ...

  6. AWT03-LayoutManager布局管理器

    1.LayoutManager布局管理器 在之前的学习中,我们使用setBounds()方法设置容器的位置大小,但我们不得不明白一件事--如果我们手动为容器设置位置大小的话,就会造成程序通用性的下降. ...

  7. 【java】浅析java组件中的布局管理器

    这篇博文笔者介绍一下java组件中,常用的布局管理器.java组件中的布局方式有好几十种,所有的这些布局管理器都实现了java.awt.LayoutManager接口.接下来笔者介绍一下常用的5种布局 ...

  8. GUI容器之布局管理器

    布局管理器 布局管理器:frame.setLayout(); 默认值为new flowLayout() 流式布局 frame.setLayout(new FlowLayout(FlowLayout.R ...

  9. PyQt5(2)——调整布局(布局管理器)第一个程序

    我们拖拽一个UI文件,转为PY文件后生成一个类Ui_MainWindow 此时,我们新建一个文件,用来控制业务逻辑(继承界面中的类),跟界面分开,这样我们就完成了界面和逻辑相分离(这段代码使用率基本1 ...

随机推荐

  1. Debian 基本使用进阶

    系统安装好了我们,迫不及待的想要在Linux系统中肆意翱翔.如果是刚刚接触Linux的系统的话,可能一时间还无法适应Linux的系统环境.对于使用Debian来做服务器的选择,最好的练习方式的就是使用 ...

  2. 微信小程序:上滑触底加载下一页

    给商品列表页面添加一个上滑触底加载下一页的效果,滚动条触底之后就发送一个请求,来加载下一页数据, 先在getGoodsList中获取总条数 由于总页数需要再另外的一个方法中使用,所以要把总页数变成一个 ...

  3. 使用PageHelper进行分页查询

    service层代码: public Result getDataSetList(String dataCode, String dataName, int pageIndex, int length ...

  4. Lambad表达式--Java8新特性

    1.概述 Lambda是一个匿名函数,是java8的一个新特性.可以对接口进行非常简洁的实现.但它要求接口中只能有一个抽象方法,原因是lambda只能实现一个方法.另外,需要在接口上添加注解@Func ...

  5. centos 修改系统时间

    centos 修改系统时间 [echo0282@instance-1 ~]$ sudo timedatectl set-timezone Asia/Shanghai   timedatefctl li ...

  6. 在 Svelte 中使用 CSS-in-JS

    你即便不需要,但你可以. 注意:原文发表于2018-12-26,随着框架不断演进,部分内容可能已不适用. CSS 是任何 Web 应用程序的核心部分. 宽泛而论,如果一个 UI 框架没有内置向组件添加 ...

  7. 第47天打卡学习(单例模式 深入了解CAS 原子引用 各种锁的理解)

    18彻底玩转 单例模式 饿汉式 DCL懒汉模式 探究! 饿汉式  package com.kuang.single; //饿汉式单例 //单例模式重要思想是构造器私有 public class Hun ...

  8. Newbe.Claptrap 框架入门,第二步 —— 创建项目

    接上一篇 Newbe.Claptrap 框架入门,第一步 -- 开发环境准备 ,我们继续了解如何创建一个 Newbe.Claptrap 项目. Newbe.Claptrap 是一个用于轻松应对并发问题 ...

  9. Python:垃圾回收

    有很多不同的方法来实现垃圾回收,例如跟踪,引用计数,转义分析,时间戳和心跳信号等.不同的语言依赖于不同的垃圾回收实现,例如,有些将其与编译器和运行时系统集成在一起.而其他语言则可能需要事后设置,甚至可 ...

  10. Python中面向对象的概念

    1.语言的分类 1)面向机器 抽象成机器指令,机器容易理解.代表:汇编语言. 2)面向过程 做一件事,排除步骤,第一步做什么,第二步做什么,如果出现A问题,做什么处理,出现b问题,做什么处理.问题规模 ...