04. 布局管理

一、什么是布局

  在 Qt Quick 中有两套与元素布局相关的类库,一套叫作 Item Positioner定位器),一套叫作 Item Layout布局)。其实在 Qt Quick 中还有一个 锚布局,它通过 Itemanchors 属性实现,是 Qt Quick 中非常灵活的一种布局方式。

  我们可以在终端中使用 pip 安装 PySide6 模块。默认是从国外的主站上下载,因此,我们可能会遇到网络不好的情况导致下载失败。我们可以在 pip 指令后通过 -i 指定国内镜像源下载

pip install pygame -i https://mirrors.aliyun.com/pypi/simple

  国内常用的 pip 下载源列表:

  • 阿里云 https://mirrors.aliyun.com/pypi/simple
  • 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple
  • 清华大学 https://pypi.tuna.tsinghua.edu.cn/simple
  • 中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple

二、锚布局

  在 QML 中,锚点(anchors)是一种用于定义元素之间相对位置和大小关系的机制。锚点允许你指定一个元素相对于其父元素或其他元素的位置和尺寸。通过使用锚点,你可以创建响应式布局,使 QML 界面能够根据不同屏幕尺寸和分辨率进行自适应调整。

  QML 中的每个元素都有一个隐式的锚点系统,你可以通过 anchors 属性来访问它。anchors 属性提供了多个属性来设置锚点的位置。

  每个 Item 都有 7 条不可见的锚线:(top)、(bottom)、(left)、(right)、水平中心(horizontalCenter)、垂直中心(verticalCenter)和 基线(baseline)。

锚线

anchors.top                                                                     // 将元素的顶部边缘锚定到某个参考点的顶部边缘
anchors.bottom                                                                  // 将元素的底部边缘锚定到某个参考点的底部边缘
anchors.left                                                                    // 将元素的左边缘锚定到某个参考点的左边缘
anchors.right                                                                   // 将元素的右边缘锚定到某个参考点的右边缘anchors.horizontalCenter                                                        // 将元素的水平中心锚定到某个参考点的水平中心
anchors.verticalCenter                                                          // 将元素的垂直中心锚定到某个参考点的垂直中心anchors.fill                                                                    // 使元素填充其父元素或参考元素的整个区域

baseline 是指文本所在的线,如果 Item 没有文字,则 baseline 就和 top 的位置相同。

  我们还可以使用 margins 属性设置四个边的边距。

边距

anchors.margins                                                                 // 设置元素与其锚点之间的外边距
anchors.leftMargin                                                              // 设置元素与其锚点之间的左边距
anchors.rightMargin                                                             // 设置元素与其锚点之间的右边距
anchors.topMargin                                                               // 设置元素与其锚点之间的顶边距
anchors.bottomMargin                                                            // 设置元素与其锚点之间的底边距

  我们新建一个 template.py 文件。

import sysfrom PySide6.QtWidgets import QApplication
from PySide6.QtQml import QQmlApplicationEngineif __name__ == "__main__":app = QApplication(sys.argv)                                                # 1.创建一个QApplication类的实例engine = QQmlApplicationEngine()                                            # 2.创建QML引擎对象engine.load("template.qml")                                                 # 3.加载QML文件sys.exit(app.exec())                                                        # 4.进入程序的主循环并通过exit()函数确保主循环安全结束

  我们新建一个 template.qml 文件。

import QtQuick.Window// Window控件表示一个顶级窗口
// 在QML中,元素是通过大括号{}内的属性来配置的。
Window {width: 800                                                                  // 窗口的宽度height: 600                                                                 // 窗口的高度visible: true                                                               // 显示窗口color: "lightgray"                                                          // 窗口的背景颜色// 定义一个文本(Text)元素Text {id: titleTextId                                                         // 定义一个标识text: "Custom Layout Example"                                           // 设置文本元素的内容font.pointSize: 24                                                      // 设置文本的字体大小color: "#FFCCCC"                                                        // 设置字体颜色// 使用锚点(anchors)系统来定位文本元素anchors.top: parent.top                                                 // 将顶部的锚点定位到父元素的顶部anchors.topMargin: 20                                                   // 设置顶部边距为20像素anchors.horizontalCenter: parent.horizontalCenter                       // 水平居中}// 定义一个文本(Text)元素Text {text: "This is an exmaple of using anchors for layout."                 // 设置文本元素的内容font.pointSize: 18                                                      // 设置文本的字体大小color: "#FF99CC"                                                        // 设置字体颜色// 使用锚点(anchors)系统来定位文本元素anchors.top: titleTextId.bottom                                         // 将顶部的锚点定位到指定控件父的底部anchors.topMargin: 20                                                   // 设置顶部边距为20像素anchors.horizontalCenter: parent.horizontalCenter                       // 水平居中}// 定义一个Item元素Item {width: 300                                                              // 宽度height: 300                                                             // 高度// 使用锚点(anchors)系统来定位文本元素,这里中心的锚点定位到其父元素的中心anchors.centerIn: parentRectangle {color: "#FF6666"                                                    // 设置矩形颜色anchors.fill: parent                                                // 填充父容器对象Text {text: "Hello Sakura!"font.pointSize: 18color: "#FFFFFF"anchors.top: parent.top                                         // 将顶部的锚点定位到指定控件父的顶部anchors.topMargin: 10                                           // 设置顶部边距为10像素anchors.horizontalCenter: parent.horizontalCenter               // 水平居中}}}// 定义一个矩形元素Rectangle {width: 100                                                              // 宽度height: 50                                                              // 高度color: "#99CCFF"                                                        // 设置矩形颜色// 使用锚点(anchors)系统来定位文本元素anchors.left: parent.left                                               // 将左侧的锚点定位到父元素的左侧anchors.leftMargin: 20                                                  // 设置左侧边距为20像素anchors.bottom: parent.bottom                                           // 将底部的锚点定位到父元素的底部anchors.bottomMargin: 20                                                // 设置底部边距为20像素}// 定义一个矩形元素Rectangle {width: 100                                                              // 宽度height: 50                                                              // 高度color: "#CCCCFF"                                                        // 设置矩形颜色anchors.right: parent.right                                             // 将右侧的锚点定位到父元素的右侧anchors.rightMargin: 20                                                 // 设置右侧边距为20像素anchors.bottom: parent.bottom                                           // 将底部的锚点定位到父元素的底部anchors.bottomMargin: 20                                                // 设置底部边距为20像素}
}

当你使用锚点时,请确保你指定的参考点(如父元素或其他元素)是有效的,并且它们在布局中是可见的。

锚点系统是基于父元素或参考元素的坐标系统来工作的,因此如果父元素或参考元素的大小或位置发生变化,依赖于它们的子元素也会相应地发生变化。

在使用锚点时,要注意避免循环依赖或相互冲突的锚点设置,这可能会导致布局问题或不可预测的行为。

三、定位器

  定位器 是一种 容器元素,专门用来管理界面中的其它元素。如果定位器中的子项目不可见(visiblefalse)、宽度或者高度为0,那么该子项目不会显示,也不会被布局。定位器可以自动布局其子项目,也就是说,其子项目不再需要显式设置 xy等属性或使用锚 anchors 进行布局。

  定位器 不会改变它管理的元素的大小,即便用户调整了界面尺寸,它也坚持不干涉孩子们的尺寸,这可能与你的期望不同,不过如果你希望使用“自动根据界面尺寸变化调整孩子们的尺寸”这种特性,可以使用 Qt Quick 中的 布局管理器

  定位器 包括 Row行定位器)、Column列定位器)、Grid栅格定位器)、Flow流式定位器)。

3.1、行定位器

  Row 沿着一行安置它的孩子们。一旦你把一个 Item 交给 Row 来管理,那就不要再使用 Itemxyanchors 等属性了。在一个 Row 内的 Item,可以使用 Positioner 附加属性来获知自己在 Row 中的详细位置信息。PositionerindexisFirstItemisLastItem 三个属性。

  Row 有一个 spacing 属性,用来指定它管理的 Item 之间的 间隔。还有一个 layoutDirection 属性,可以指定 布局方向,取值为 Qt.LeftToRight从左到右 放置 Item,这是默认行为,取值为 Qt.RightToLeft从右向左 放置 Item

  Row 还有 addmovepopulate 三个 Transition 类型的属性,分别指定应用于 Item 添加Item 移动定位器初始化创建Items 三种场景的过渡动画。

  修改 template.qml 文件的内容。

import QtQuick.Window// Window控件表示一个顶级窗口
// 在QML中,元素是通过大括号{}内的属性来配置的。
Window {width: 800                                                                  // 窗口的宽度height: 600                                                                 // 窗口的高度visible: true                                                               // 显示窗口color: "lightgray"                                                          // 窗口的背景颜色// 定义一个Row,用于水平布局Row {anchors.centerIn: parent                                                // 将中心的锚点定位到父元素的中心spacing: 100                                                            // 用于设置子元素之间的间隔layoutDirection: Qt.RightToLeft                                         // 设置布局的显示方向为从右到左Rectangle {width : 100                                                         // 宽度height: 100                                                         // 高度color: "#CCCCFF"                                                    // 设置矩形颜色}Rectangle {width : 100                                                         // 宽度height: 50                                                          // 高度color: "#99CCFF"                                                    // 设置矩形颜色}Rectangle {width : 100                                                         // 宽度height: 100                                                         // 高度color: "#FF6666"                                                    // 设置矩形颜色}}
}

行定位器

Row 本身也是一个Item,可以使用 anchors 布局来决定它在父 Item 中的位置。

如果 Row 中的 Item 不是 visible,或者其宽度或高度为 0,则该项目将不会布局,在行中也不可见。

3.2、列定位器

  ColumnRow 类似,不过是在垂直方向上安排它的子ItemColumnspacing 属性描述子 Item 之间的间隔。

  修改 template.qml 文件的内容。

import QtQuick.Window// Window控件表示一个顶级窗口
// 在QML中,元素是通过大括号{}内的属性来配置的。
Window {width: 800                                                                  // 窗口的宽度height: 600                                                                 // 窗口的高度visible: true                                                               // 显示窗口color: "lightgray"                                                          // 窗口的背景颜色// 定义一个Column,用于垂直布局Column {anchors.centerIn: parent                                                // 将中心的锚点定位到父元素的中心spacing: 100                                                            // 用于设置子元素之间的间隔Rectangle {width : 100                                                         // 宽度height: 100                                                         // 高度color: "#CCCCFF"                                                    // 设置矩形颜色}Rectangle {width : 50                                                          // 宽度height: 50                                                          // 高度color: "#99CCFF"                                                    // 设置矩形颜色}Rectangle {width : 100                                                         // 宽度height: 100                                                         // 高度color: "#FF6666"                                                    // 设置矩形颜色}}
}

列定位器

3.3、栅格定位器

  Grid 在一个网格上安置它的子 Item,它会创建一个拥有很多单元格的网格,足够容纳它的所有子 ItemGrid 会从左到右、从上到下把它的子 Item 一个个塞到单元格里。Item 默认会被放在一个单元格左上角,即 (0, 0) 位置。

  我们可以通过 Gridrowscolumns 属性 指定表格的行、列数。如果不设置,默认只有 4 列,而行数则会根据实际的 Item 数量自动计算。rowSpacingcolumnSpacing 属性用来 指定行、列间距,单位是像素。

  Gridflow 属性 描述表格的流模式Grid.LeftToRight 是默认值,这种流模式 从左到右 一个挨一个放置 Item,一行放满再放下一行。flow 取值为 Grid.TopToBottom 时,从上到下 一个挨一个放置 Item,一列放满再放下一列。

  GridhorizontalItemAlignmentverticalItemAlignment 属性用来 指定单元格对齐方式。默认的单元格对齐方式和 layoutDirection 以及 flow 有关。

  • horizontalItemAlignment 的有效值是 Grid.AlignLeftGrid.AlignRightGrid.AlignHCenter
  • verticalItemAlignment 的有效值是 Grid.AlignTopGrid.AlignBottomGrid.AlignVCenter

  修改 template.qml 文件的内容。

import QtQuick.Window// Window控件表示一个顶级窗口
// 在QML中,元素是通过大括号{}内的属性来配置的。
Window {width: 800                                                                  // 窗口的宽度height: 600                                                                 // 窗口的高度visible: true                                                               // 显示窗口color: "lightgray"                                                          // 窗口的背景颜色// 定义一个GridLayout,用于网格布局Grid {anchors.centerIn: parent                                                // 将中心的锚点定位到父元素的中心rows: 3                                                                 // 设置行数columns: 3                                                              // 设置列数rowSpacing: 10                                                          // 设置行间距columnSpacing: 10                                                       // 设置列间距horizontalItemAlignment: Grid.AlignHCenter                              // 设置水平对齐方式verticalItemAlignment: Grid.AlignVCenter                                // 设置垂直对齐方式Rectangle {width : 100                                                         // 宽度height: 100                                                         // 高度color: "#FF6666"                                                    // 设置矩形颜色}Rectangle {width : 100                                                         // 宽度height: 100                                                         // 高度color: "#FF6666"                                                    // 设置矩形颜色}Rectangle {width : 100                                                         // 宽度height: 100                                                         // 高度color: "#FF6666"                                                    // 设置矩形颜色}Rectangle {width : 100                                                         // 宽度height: 100                                                         // 高度color: "#99CCFF"                                                    // 设置矩形颜色}Rectangle {width : 50                                                          // 宽度height: 50                                                          // 高度color: "#99CCFF"                                                    // 设置矩形颜色}Rectangle {width : 100                                                         // 宽度height: 100                                                         // 高度color: "#99CCFF"                                                    // 设置矩形颜色}Rectangle {width : 100                                                         // 宽度height: 100                                                         // 高度color: "#CCCCFF"                                                    // 设置矩形颜色}Rectangle {width : 100                                                         // 宽度height: 100                                                         // 高度color: "#CCCCFF"                                                    // 设置矩形颜色}Rectangle {width : 100                                                         // 宽度height: 100                                                         // 高度color: "#CCCCFF"                                                    // 设置矩形颜色}}
}

栅格定位器

3.4、流式定位器

  在 QML 中,Flow 是一种非常灵活的布局方式,它允许元素根据容器的尺寸和元素的尺寸自动进行排列,类似于文本排版中的 “流” 概念,元素会按照指定的方向(通常是水平或垂直)依次排列,当一行或一列无法容纳更多元素时,会自动换行或换列。

  Flowflow 属性,默认取值 Flow.LeftToRight从左到右 安排 Item,直到 Flow 本身的宽度不能容纳新的子 Item 时折行。当 flow 取值 Flow.TopToBottom 时,从上到下 安排 Item,直到 Flow 本身的高度不能容纳新的子 Item 时开始在下一列上安排 Item。在 QML 中,我们还可以通过 spacing 属性来 设置元素之间的间距

  修改 template.qml 文件的内容。

import QtQuick.Window// Window控件表示一个顶级窗口
// 在QML中,元素是通过大括号{}内的属性来配置的。
Window {width: 800                                                                  // 窗口的宽度height: 600                                                                 // 窗口的高度visible: true                                                               // 显示窗口color: "lightgray"                                                          // 窗口的背景颜色// 定义一个Flow,用于流式布局Flow {width: parent.width                                                     // 宽度height: parent.height                                                   // 高度 anchors.centerIn: parent                                                // 将中心的锚点定位到父元素的spacing: 100                                                            // 用于设置子元素之间的间隔// Repeater是一个用于根据模型(通常是列表或数组)动态生成一组子元素的有用工具Repeater{// 定义了数据源,通常是一个列表或数组。model: 18                                                           // 设置重读的次数// 定义了如何显示模型中的每个项目,它是一个包含要实例化的 QML 元素的组件。delegate: Rectangle{width: 100height: 100color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1)}}}
}

流式定位器

四、布局管理器

  Qt Quick 中的 布局管理器 是一组用于在用户界面中排列项目的类型。布局管理器 不仅进行布局,而且会改变子 Item 的大小,所以更适用于需要改变用户界面大小的应用。因为布局管理器也是继承自 Item,所以它们可以嵌套。布局管理器 包括 行布局(RowLayout)、列布局(ColumnLayout)、表格布局(GridLayout)。

4.1、水平布局管理器

  在 QML 中,水平布局通常是通过 RowLayout 来实现的。RowLayout 是一种布局管理器,它允许你将子元素水平地排列在一行中。RowLayout 有一个 spacing 属性,用来 指定它管理的 Item 之间的间隔。还有一个 layoutDirection 属性,可以 指定布局方向,取值为 Qt.LeftToRight从左到右放置 Item,这是默认行为,取值为 Qt.RightToLeft从右向左放置 Item

  修改 template.qml 文件的内容。

import QtQuick.Window
import QtQuick.Layouts// Window控件表示一个顶级窗口
// 在QML中,元素是通过大括号{}内的属性来配置的。
Window {width: 800                                                                  // 窗口的宽度height: 600                                                                 // 窗口的高度visible: true                                                               // 显示窗口color: "lightgray"                                                          // 窗口的背景颜色// 定义一个RowLayout,用于水平布局RowLayout {anchors.centerIn: parent                                                // 将中心的锚点定位到父元素的中心spacing: 100                                                            // 用于设置子元素之间的间隔layoutDirection: Qt.RightToLeft                                         // 设置布局的显示方向为从右到左Rectangle {implicitWidth : 100                                                 // 设置矩形的隐式宽度implicitHeight: 100                                                 // 设置矩形的隐式高度color: "#CCCCFF"                                                    // 设置矩形颜色}Rectangle {Layout.preferredWidth : 150                                         // 设置矩形的首选宽度Layout.preferredHeight : 50                                         // 设置矩形的首选高度color: "#99CCFF"                                                    // 设置矩形颜色}Rectangle {implicitWidth : 100                                                 // 设置矩形的隐式宽度Layout.preferredHeight: 100                                         // 设置矩形的首选高度color: "#FF6666"                                                    // 设置矩形颜色}}
}

水平布局管理器

在布局中如何要设置 Item 的宽度和高度,推荐使用 implicitWidth 属性 和 implicitHeight 属性设置,或者使用 Layout.preferredWidthLayout.preferredHeight 设置。

4.2、垂直布局管理器

  在 QML 中,垂直布局通常是通过 ColumnLayout 来实现的。这些布局管理器允许你将子元素垂直地排列在一起。ColumnLayout 本身也是一个 Item,可以使用 anchors 布局来决定它在父 Item 中的位置。ColumnLayoutspacing 属性描述 Item 之间的间隔

  修改 template.qml 文件的内容。

import QtQuick.Window
import QtQuick.Layouts// Window控件表示一个顶级窗口
// 在QML中,元素是通过大括号{}内的属性来配置的。
Window {width: 800                                                                  // 窗口的宽度height: 600                                                                 // 窗口的高度visible: true                                                               // 显示窗口color: "lightgray"                                                          // 窗口的背景颜色// 定义一个ColumnLayout,用于垂直布局ColumnLayout {height: parent.height                                                   // 高度anchors.centerIn: parent                                                // 将中心的锚点定位到父元素的中心Rectangle {implicitWidth : 100                                                 // 设置矩形的隐式宽度implicitHeight: 100                                                 // 设置矩形的隐式高度color: "#FF6666"                                                    // 设置矩形颜色}Rectangle {Layout.preferredWidth : 50                                          // 设置矩形的首选宽度Layout.preferredHeight : 50                                         // 设置矩形的首选高度color: "#99CCFF"                                                    // 设置矩形颜色}Rectangle {implicitWidth : 100                                                 // 设置矩形的隐式宽度Layout.preferredHeight: 100                                         // 设置矩形的首选高度color: "#CCCCFF"                                                    // 设置矩形颜色}}
}

4.3、栅格布局管理器

  在 QML 中,栅格布局是通过 GridLayout 来实现的。GridLayout 允许你将子元素放置在一个二维的网格中,并且可以指定网格的行数和列数,并控制每个元素在网格中的位置、大小和跨越多个单元格的能力。

  你可以通过 GridLayoutrowscolumns 属性 设定表格的行、列数rowSpacingcolumnSpacing 属性 指定行、列间距,单位是像素。

  在每个 Item 项中,我们可以通过 Layout.rowLayout.column 属性 指定该项在栅格布局中的位置。我们还可以通过 Layout.rowSpanLayout.columnSpan 属性 指定合并的行和列

  修改 template.qml 文件的内容。

import QtQuick.Window
import QtQuick.Layouts// Window控件表示一个顶级窗口
// 在QML中,元素是通过大括号{}内的属性来配置的。
Window {width: 800                                                                  // 窗口的宽度height: 600                                                                 // 窗口的高度visible: true                                                               // 显示窗口color: "lightgray"                                                          // 窗口的背景颜色// 定义一个GridLayout,用于网格布局GridLayout {width: parent.width                                                     // 宽度height: parent.height                                                   // 高度 anchors.centerIn: parent                                                // 将中心的锚点定位到父元素的中心rows: 3                                                                 // 设置行数columns: 3                                                              // 设置列数rowSpacing: 10                                                          // 设置行间距columnSpacing: 10                                                       // 设置列间距Rectangle {color: "#FF6666"                                                    // 设置矩形颜色implicitWidth: 200                                                  // 设置矩形的隐式宽度implicitHeight: 200                                                 // 设置矩形的隐式高度Layout.row: 0                                                       // 设置矩形所在的行Layout.column: 0                                                    // 设置矩形所在的列}Rectangle {color: "#FF6666"                                                    // 设置矩形颜色Layout.preferredWidth: 200                                          // 设置矩形的首选宽度Layout.preferredHeight: 200                                         // 设置矩形的首选高度Layout.row: 0                                                       // 设置矩形所在的行Layout.column: 1                                                    // 设置矩形所在的列}Rectangle {color: "#FF6666"                                                    // 设置矩形颜色implicitWidth: 200                                                  // 设置矩形的隐式宽度Layout.preferredHeight: 200                                         // 设置矩形的首选高度Layout.row: 0                                                       // 设置矩形所在的行Layout.column: 2                                                    // 设置矩形所在的列}Rectangle {color: "#99CCFF"                                                    // 设置矩形颜色Layout.row: 1                                                       // 设置矩形所在的行Layout.column: 0                                                    // 设置矩形所在的列Layout.rowSpan: 2                                                   // 占用二行Layout.columnSpan: 1                                                // 占用一列Layout.fillWidth: true                                              // 设置矩形填充Column布局的宽度Layout.fillHeight: true                                             // 设置矩形填充Column布局的高度}Rectangle {color: "#99CCFF"                                                    // 设置矩形颜色Layout.row: 1                                                       // 设置矩形所在的行Layout.column: 1                                                    // 设置矩形所在的列Layout.rowSpan: 1                                                   // 占用一行Layout.columnSpan: 2                                                // 占用两列Layout.fillWidth: true                                              // 设置矩形填充Column布局的宽度Layout.fillHeight: true                                             // 设置矩形填充Column布局的高度}Rectangle {color: "#CCCCFF"                                                    // 设置矩形颜色Layout.row: 2                                                       // 设置矩形所在的行Layout.column: 1                                                    // 设置矩形所在的列Layout.fillWidth: true                                              // 设置矩形填充Column布局的宽度Layout.fillHeight: true                                             // 设置矩形填充Column布局的高度}Rectangle {color: "#CCCCFF"                                                    // 设置矩形颜色Layout.row: 2                                                       // 设置矩形所在的行Layout.column: 2                                                    // 设置矩形所在的列Layout.fillWidth: true                                              // 设置矩形填充Column布局的宽度Layout.fillHeight: true                                             // 设置矩形填充Column布局的高度}}
}

栅格布局

  在栅格布局中,如果我们添加的子元素不指定行列信息,子元素会呈现水平布局或垂直布局。GridLayoutflow 属性描述 栅格布局的流模式Grid.LeftToRight 是默认值,这种流模式从左到右一个挨一个放置 Item,一行放满再放下一行。flow 取值为Grid.TopToBottom 时,从上到下一个挨一个放置 Item,一列放满再放下一列。

  修改 template.qml 文件的内容。

import QtQuick.Window
import QtQuick.Layouts// Window控件表示一个顶级窗口
// 在QML中,元素是通过大括号{}内的属性来配置的。
Window {width: 800                                                                  // 窗口的宽度height: 600                                                                 // 窗口的高度visible: true                                                               // 显示窗口color: "lightgray"                                                          // 窗口的背景颜色// 定义一个GridLayout,用于网格布局GridLayout {width: parent.width                                                     // 宽度height: parent.height                                                   // 高度 anchors.centerIn: parent                                                // 将中心的锚点定位到父元素的中心rows: 3                                                                 // 设置行数columns: 3                                                              // 设置列数rowSpacing: 10                                                          // 设置行间距columnSpacing: 10                                                       // 设置列间距flow: Grid.TopToBottom                                                  // 设置布局方式Rectangle {color: "#FF6666"                                                    // 设置矩形颜色Layout.fillWidth: true                                              // 设置矩形填充Column布局的宽度Layout.fillHeight: true                                             // 设置矩形填充Column布局的高度}Rectangle {color: "#FF6666"                                                    // 设置矩形颜色Layout.rowSpan: 2                                                   // 占用二行Layout.columnSpan: 1                                                // 占用一列Layout.fillWidth: true                                              // 设置矩形填充Column布局的宽度Layout.fillHeight: true                                             // 设置矩形填充Column布局的高度}Rectangle {color: "#99CCFF"                                                    // 设置矩形颜色Layout.fillWidth: true                                              // 设置矩形填充Column布局的宽度Layout.fillHeight: true                                             // 设置矩形填充Column布局的高度}Rectangle {color: "#99CCFF"                                                    // 设置矩形颜色Layout.rowSpan: 1                                                   // 占用一行Layout.columnSpan: 2                                                // 占用二列Layout.fillWidth: true                                              // 设置矩形填充Column布局的宽度Layout.fillHeight: true                                             // 设置矩形填充Column布局的高度}Rectangle {color: "#99CCFF"                                                    // 设置矩形颜色Layout.fillWidth: true                                              // 设置矩形填充Column布局的宽度Layout.fillHeight: true                                             // 设置矩形填充Column布局的高度}Rectangle {color: "#CCCCFF"                                                    // 设置矩形颜色Layout.rowSpan: 2                                                   // 占用二行Layout.columnSpan: 1                                                // 占用一列Layout.fillWidth: true                                              // 设置矩形填充Column布局的宽度Layout.fillHeight: true                                             // 设置矩形填充Column布局的高度}Rectangle {color: "#CCCCFF"                                                    // 设置矩形颜色Layout.fillWidth: true                                              // 设置矩形填充Column布局的宽度Layout.fillHeight: true                                             // 设置矩形填充Column布局的高度}}
}

栅格布局的流模式

4.4、栈布局管理器

  栈布局管理器 StackLayout 可以管理多个项目,但只能显示一个项目。可以通过 currentIndex 属性来 设置当前显示的项目,索引号对应布局管理器中子项目的顺序,从 0 开始。另外,StackLayout 还包含 indexisCurrentItem 等附加属性。

  修改 template.qml 文件的内容。

import QtQuick.Window
import QtQuick.Layouts// Window控件表示一个顶级窗口
// 在QML中,元素是通过大括号{}内的属性来配置的。
Window {width: 800                                                                  // 窗口的宽度height: 600                                                                 // 窗口的高度visible: true                                                               // 显示窗口color: "lightgray"                                                          // 窗口的背景颜色// 定义一个StackLayout,用于栈布局StackLayout {id: stackLayoutId                                                       // IDwidth: parent.width                                                     // 宽度height: parent.height                                                   // 高度 anchors.centerIn: parent                                                // 将中心的锚点定位到父元素的中心Rectangle {color: "#FF6666"                                                    // 设置矩形颜色Layout.fillWidth: true                                              // 填充宽度Layout.fillHeight: true                                             // 填充高度}Rectangle {color: "#66ffb0ff"                                                    // 设置矩形颜色Layout.fillWidth: true                                              // 填充宽度Layout.fillHeight: true                                             // 填充高度}Rectangle {color: "#6673ffff"                                                    // 设置矩形颜色Layout.fillWidth: true                                              // 填充宽度Layout.fillHeight: true                                             // 填充高度}}// 鼠标事件MouseArea {anchors.fill: parent                                                    // 填充父元素// 点击事件onClicked: {stackLayoutId.currentIndex = (stackLayoutId.currentIndex + 1) % stackLayoutId.count}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/925308.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于安装博客园皮肤中有关于配置音乐播放器的补充(awescnb)

首先,关于安装博客园皮肤的教程,请看教程: https://www.yuque.com/awescnb/user 大佬的教程非常详细且通俗易懂,只要有一点点前端基础,很短时间就能安装完成 但有关于音乐播放器的配置中,获取音乐url以及lrc歌词…

AGC VP 记录 2

AGC VP 记录 为了防止上一个内容太多比较卡,故新开了一个。 AGC041~AGC060 AGC060 [AGC060A] No Majority skip。Submission #69562933 - AtCoder Grand Contest 060 [AGC060B] Unique XOR Path给定一个 \(n\times m\…

婚纱定制网站哪个好做特卖网站

第二期云开发0基础训练营热力来袭!课程升级、更佳体验、依旧免费!每年的 “金九银十” 都是传说中的学习黄金期!这期间在校的小伙伴面临开学季/求职季/考研季挑战,已经步入社会的也即将步入年终前的冲刺阶段。所以,这段…

2025 --【J+S 二十连测】-- 第四套 总结

总结 T1 考场上很快想出了正解,并打出了代码,没什么问题 T2 考场上很快就打出了正解,但是由于精度问题,导致失分 T3 考场上没有想到解法,打了个部分分,但是挂0 T4 考场上打了个部分分,哪全了 题解 T1 不难发现,…

无锡市城乡和住房建设局网站wordpress ffmpeg

在手工测试阶段,针对项目输出了测试用例,如果这些测试用例需要在版本迭代的过程中,需要进行回归测试,通过手工重复地执行测试用例,将会耗费大量的人力。 为此应运而生就有了自动化测试,通过使用自动化工具…

深入解析:AI-调查研究-90-具身智能 机器人数据采集与通信中间件全面解析:ROS/ROS2、LCM 与工业总线对比

深入解析:AI-调查研究-90-具身智能 机器人数据采集与通信中间件全面解析:ROS/ROS2、LCM 与工业总线对比pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: …

函数-装饰器基础知识+推导式

装饰器:    在不改变原函数代码基础上,为原函数扩展功能装饰器格式: ##装饰器的编写(函数的嵌套,外城函数返回内城函数): def wrapper (funk):def inner (*args,**kwags):#自定义共能,根据功能在funk函数执行…

用ip访问没有备案的网站国内外知名市场调研公司

Redis,作为内存数据结构存储的佼佼者,其高性能表现一直备受赞誉。那么,Redis究竟是如何实现这一点的呢?接下来,我们将更深入地探讨其背后的关键技术,并提供进一步的优化策略。 一、内存存储与数据结构设计…

机器人产业学院 —— 教培机构 —— 职业发展 —— 全国性比赛

机器人产业学院 —— 教培机构 —— 职业发展 —— 全国性比赛本博客是博主个人学习时的一些记录,不保证是为原创,个别文章加入了转载的源地址,还有个别文章是汇总网上多份资料所成,在这之中也必有疏漏未加标注处,…

VUE - 实战 2

vue 项目 tailwindcss 安装 安装 命令 npm install -D tailwindcss@3 postcss autoprefixer现在 版本4.1 和vue集成有问题,所有用32 初始化配置文件: npx tailwindcss init -p3 修改 tailwind.config.js 配置: /** …

平面设计免费模板网站济南装修网

以下是百度统计的诊断,小弟万般无奈,html上的缓存以及图片处理技巧欠缺,希望各位大大帮帮忙支个招! 以下元素可在不损失原信息量的前提下进行压缩: http://www.5atl.com/Style/main.css (大小: …

QBXT2025S刷题 Day1

今天的题目 T1 \(90pts\)。 赛时树状数组写挂了。 发现没有特判第一个数是 \(0\)。 我的思路是,\(cnt[x]\) 表示对于所有的 \(h[i] \geq x\) 可以构成多少个区间。 先离散化。 对于当前 \(h[i]\),若 \(h[i - 1] <…

wordpress 仅显示标题seo会被取代吗

在当今快节奏的软件开发领域&#xff0c;提升开发效率是每个开发者都追求的目标。对于 Vue 前端开发而言&#xff0c;Visual Studio Code&#xff08;VSCode&#xff09;已经成为了众多开发者的首选编辑器。而随着人工智能技术的发展&#xff0c;各类 AI 编码扩展工具如雨后春笋…

2025多校冲刺CSP模拟赛1(螳臂复活祭)

写在前面:题解未动,废话先行: 这次的模拟赛,肝硬化竟取得了比它近三次校内模拟赛的总分之和还要高 \(5pts\) 的成绩!(虽然 \(rank~50\) ),兴奋异常(其实没有),遂写博文(其实是前几天没空写)。顺带一提,那…

龙岩做网站的公司网站开发资源网

1. 题目 给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict&#xff0c;在字符串中增加空格来构建一个句子&#xff0c;使得句子中所有的单词都在词典中。返回所有这些可能的句子。 说明&#xff1a; 分隔时可以重复使用字典中的单词。 你可以假设字典中没有重复的…

最新创建的网站网站建设及推广

一、MybatisPlus简介 MybatisPlus&#xff08;简称MP&#xff09;是一个流行的Java持久层框架&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生&#xff0c;旨在简化数据库操作和提高开发效率。MybatisPlus为开发者提供了一套方便的API和…

tar: Ignoring unknown extended header keyword LIBARCHIVE.xattr.com.apple.provenance

tar: Ignoring unknown extended header keyword LIBARCHIVE.xattr.com.apple.provenance这个警告信息是由于不同操作系统之间归档工具的兼容性问题导致的。 错误信息解释 关键词含义LIBARCHIVE.xattr.com.apple.prove…

短剧小程序核心专业的技术拆解:视频加载优化、用户留存与商业化落地​

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

上小学网站建设php网站开发技术背景

更新spring-boot jar包中的BOOT-INF/lib目录下的jar包 场景 需要更新lib目录下某个jar包的配置文件 失败的解决方法 用解压软件依次打开spring-boot jar包&#xff08;设为a.jar&#xff09;、BOOT-INF/lib目录下的jar包&#xff08;设为b.jar&#xff09;&#xff0c;然后修改…

电影网站推荐哪个网站好沧州网站艰涩很

点击菜单栏 File --> Project Structure 在弹出的窗口中点击选择左侧的 Facets&#xff0c;接着点击右边的 &#xff0c;弹出的菜单中选择 web 在弹出的 『Choose Module』窗口中选择要转为 web 的项目&#xff08;模块&#xff09;&#xff0c;然后点击 OK 选择好模块后…