目录 布局管理 1、 布局概念 2、 布局方式 2.1 手动布局 2.1.1 绝对布局 2.1.2 方法重写 2.2 布局管理器 3、 布局管理器概念 4、 使用演示 5、 详细使用 5.1 QLayout 5.1.1 作用 5.1.2 功能描述 5.
- 布局管理
- 1、 布局概念
- 2、 布局方式
- 2.1 手动布局
- 2.1.1 绝对布局
- 2.1.2 方法重写
- 2.2 布局管理器
- 2.1 手动布局
- 3、 布局管理器概念
- 4、 使用演示
- 5、 详细使用
- 5.1 QLayout
- 5.1.1 作用
- 5.1.2 功能描述
- 5.1.2.1 构造函数
- 5.1.2.2 方法功能
- 5.2 QBoxLayout
- 5.2.1 作用
- 5.2.2 功能描述
- 5.2.2.1 构造函数
- 5.2.2.2 方法功能
- 5.2.2.3 添加元素
- 5.3 QHNoxLayout
- 5.4 QVBoxLayout
- 5.5 QGridLayout
- 5.5.1 作用
- 5.5.2 功能描述
- 5.5.2.1 元素操作
- 5.5.2.2 拉伸因子和宽高
- 5.5.2.3 间距
- 5.5.2.4 原点角
- 5.5.2.5 信息获取
- 5.6 QStackedLayout
- 5.6.1 作用
- 5.6.2 功能描述
- 5.6.2.1 添加子控件
- 5.6.2.2 获取子控件
- 5.6.2.3 切换
- 5.6.2.4 展示模式
- 5.6.3 信号
- 5.7 QFormLayout
- 5.7.1 作用
- 5.7.2 功能描述
- 5.7.2.1 构造函数
- 5.7.2.2 行操作
- 5.7.2.3 行的包装策略
- 5.7.2.4 对齐和间距
- 5.7.2.5 字段增长策略
- 5.1 QLayout
布局就是指按照某种规则将子控件摆放在父控件中
2、 布局方式 2.1 手动布局 2.1.1 绝对布局直接给具体的坐标信息和尺寸信息;设置之后,后续如果不重新设置,则一直不变
操作方法:move() resize()
重写resizeEvent(evt)
方法
在内部,根据父控件的尺寸大小的调整重新计算
2.2 布局管理器包含了一些特定的规则:
- 横着水平排列
- 竖着垂直排列
- 网格排列
- 表单排列
- ···
使用这些布局管理器进行布局,可以快速的实现指定布局效果,不需要手动计算位置尺寸
3、 布局管理器概念Qt包含一个布局管理类的集合,它们被用来描述控件如何在应用程序的用户界面中呈现的;当可用空间发生减少时,这些布局将自动调整控件的位置和大小
布局管理器不是界面控件,而是界面控件的定位策略
所有QWidget类别及其子类都可以用布局来管理它们的子控件
- 布局子控件
- 最高层窗口可感知的默认大小
- 最高层窗口可感知的最小大小
- 调整大小的处理
- 当内容改变的时候自动更新:
- 字体大小、文本或者子控件的其他内容
- 隐藏或者显示子控件
- 移除一些子控件
- 创建布局对象
- 不需要设置父对象
- 设置布局对象参数
- 设置给需要布局子控件的父控件 \ 调整方向
- 将布局控件内部的子控件添加到布局管理器中,自动进行布局
布局管理器的抽象基类
5.1.2 功能描述 5.1.2.1 构造函数#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: kun
from PyQt5.Qt import *
import sys
app = QApplication(sys.argv)
w = QWidget()
w.resize(500, 500)
# 可以不用自定父控件
l1 = QLabel("标签1")
l1.setStyleSheet("background-color: cyan")
l2 = QLabel("标签2")
l2.setStyleSheet("background-color: yellow")
l3 = QLabel("标签3")
l3.setStyleSheet("background-color: red")
# 1. 创建一个布局管理器对象
layout = QBoxLayout(QBoxLayout.LeftToRight) # 创建
# 2. 直接把布局管理器对象设置给需要布局的父控件,并进行布局
w.setLayout(layout)
# 3. 把需要布局的子控件添加到布局管理器当中
layout.addWidget(l1)
layout.addWidget(l2)
layout.addWidget(l3)
w.show()
sys.exit(app.exec_())
5.1.2.2 方法功能
# 小控件之间的间距
setSpacing(int)
# 外边距
setContentMargins(QMargin)
# 添加子控件
addWidget(QWidget)
# 替换子控件
replaceWidget(QWiget from, QWiget to) # 注意被替换的空间,不再被此布局管理,替换后要对被替换的空间进行隐藏:hide()、删除:setParent(None)、重新添加到新的布局中
# 添加子布局
addLayout(QLayout)
# 能用性
setEnabled(bool)
5.2 QBoxLayout
5.2.1 作用
提供水平或垂直方向的布局管理器;这个一般很少使用,会选择两个封装好的子类
5.2.2 功能描述 5.2.2.1 构造函数QBoxLayout(QBoxLayout.Direction, parent: QWidget = None)
5.2.2.2 方法功能
# 修改方向
setDircetion(QBoxLayout.Direction)
direction() # 获取方向
# 设置伸缩因子,返回布尔值
setStretchFactor(QWidget, int)
setStretchFactor(QLayout, int)
# 边距
setContentsMargins(QMargin)
setSpacing(int)
5.2.2.3 添加元素
# 添加控件
addWidget(QWidget)
insertWidget(int, QWidget)
# 添加子布局
addLayout(QLayout)
insertLayout(int, QLayout)
# 替换控件
replaceWidget(QWidget from, QWidget to)
# 移除控件
removeWidget(QWidget)
QWidget.hide() # 隐藏子控件
# 添加空白
addSpace(int)
insertSpace(int, int)
# 添加伸缩因子,默认为0
addStretch(int stretch)
insertStretch(int, int stretch)
5.3 QHNoxLayout伸缩因子:就比如是按比例拉伸
继承自QBoxLayout
只是在构造函数中确定了方向为水平方向,其他方法一模一样
5.4 QVBoxLayout继承自QBoxLayout
只是在构造函数中确定了方向为垂直方向,其他方法一模一样
5.5 QGridLayout 5.5.1 作用网格布局,取可用空间(通过其父布局或parentWidget()),将其划分为行和列;并将其管理的每个窗口小控件放入正确的单元控件
每列 / 行具有最小宽度和拉伸系数:
- 最小宽度
set xxx MinimumWidth(int)
- 拉伸因子使用
set xxx Stretch(int)
# 控件
addWidget(*args, **kwargs)
# 布局
addLayout(*args, **kwargs)
# 位置获取
getItemPosition(int)
# 条目获取
itemAtPosition(int row, int col)
5.5.2.2 拉伸因子和宽高
setColumnMinimumWidth(int col, int minSize)
setColumnStretch(int col, int strecth)
setRowMinimumWidth(int row, int minSize)
setRowStretch(int row, int stretch)
5.5.2.3 间距
setVerticalSpacing(int)
setHorizontalSpacing(int)
setSpacing(int)
5.5.2.4 原点角
originCorner(Qt.Corner)
5.5.2.5 信息获取相对坐标的原点
cellRect(int row, int col) # 获取对应位置的控件的 QRect 对象
columnCount()
rowCount()
5.6 QStackedLayout
5.6.1 作用
提供一个堆叠起来的布局,在同一时刻只能显示一个控件;里面提供了相关方法,可以切换控件
5.6.2 功能描述 5.6.2.1 添加子控件addWidget(QWidget)
insertWidget(int, QWidget) # 返回插入位置的索引
5.6.2.2 获取子控件
widget(int index) # 根据索引获取某个子控件
5.6.2.3 切换
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: kun
from PyQt5.Qt import *
import sys
app = QApplication(sys.argv)
w = QWidget()
w.resize(300, 300)
l1 = QLabel("标签1")
l1.setStyleSheet("background-color: cyan")
l2 = QLabel("标签2")
l2.setStyleSheet("background-color: yellow")
l3 = QLabel("标签3")
l3.setStyleSheet("background-color: red")
# 创建一个布局管理器
s = QStackedLayout()
# 把布局对象设置给需要布局的父控件,父布局
w.setLayout(s)
# 通过布局对象,管理布局一些子控件
s.addWidget(l1)
s.addWidget(l2)
s.addWidget(l3)
# 切换控件
timer = QTimer(w) # 创建一个定时器
timer.timeout.connect(lambda: s.setCurrentIndex((s.currentIndex() + 1) % s.count())) # 通过设置索引来切换
# 或者使用 setCurrentWidget() 来切换
timer.start(1000) # 每隔1秒钟启动一次
w.show()
sys.exit(app.exec_())
5.6.2.4 展示模式
setStackingMode(QStackedLayout.StackingMode)
stackingMode()
5.6.3 信号
QStackedLayout.StackingMode
:
QStackedLayout.StackOne
:只有当前小控件,默认QStackedLayout.StackAll
:所有小部件都可见,当前控件显示在最前面
currentChanged(int index)
widgetRemoved(int index)
5.7 QFormLayout
5.7.1 作用
管理输入控件及其关联标签的形式;它以两列的形式列出其子元素;左列由标签组成,右列由“字段”小部件(行编辑器、旋转框等)组成
继承自QLayout
5.7.2 功能描述 5.7.2.1 构造函数#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# @author: kun
from PyQt5.Qt import *
import sys
app = QApplication(sys.argv)
w = QWidget()
w.resize(300, 300)
name = QLabel("姓名:")
age = QLabel("年龄:")
name_i = QLineEdit()
age_i = QSpinBox()
# 创建布局管理器
fl = QFormLayout() # 创建对象
# 把布局管理器赋值给需要布局的父控件
w.setLayout(fl)
# 把需要布局的子控件交给布局管理器进行管理
fl.addRow(name, name_i)
fl.addRow(age, age_i)
w.show()
sys.exit(app.exec_())
5.7.2.2 行操作
# 添加行
addRow(*args, **kwargs)
# 插入行
insertRow(*args, **kwargs)
# 获取行信息
getWidgetPosition(QWidget) # 返回(int, QFormLayout.ItemRole)
getLayoutPosition(QLayout)
rowCount() # 获取行的总个数
# 修改行
setLayout(int, QFormLayoutt.ItemRole, QLayout)
setWidget(int, QFormLayoutt.ItemRole, QWidget) # 根据行号和角色,设置相关控件或布局,如果有必要会延长布局;如果单元格已被占用,则不会设置成功
# 移除行(删除子控件)移除一整行
removeRow(*args, **kwargs)
# 移除行(不删除子控件)
takeRow(*aargsm **kkwargs) # 返回 QFormLayout.TakeRowResult,如果没有删除,最好把被移除的控件隐藏掉
# 标签操作
labelForField(QWidget / QLayout) # 根据某一控件或布局来获取标签对象
5.7.2.3 行的包装策略
QFormLayout.ItemRole
:
LabelRole
:标签FieldRole
:输入框SpanningRole
:跨越标签和输入框的控件里面的不定长参数,请通过源码来获取添加
setRowWrapPolicy(QFormLayout.RowWrapPolicy)
rowWrapPolicy()
5.7.2.4 对齐和间距
QFormLayout.RowWrapPolicy
:
QFormLayout.DontWrapRows
:字段总在标签旁边QFormLayout.WrapLongRows
:标签被赋予足够的水平空间以适合最宽的标签,其余控件被赋予字段;如果字段的最小大小比可用空间宽,则该字段将换行到下一行QFormLayout.WrapAlllRows
:字段总是位于其标签下方
# 对齐
setFormAlignment(Qt.Alignment=None, Qt.AlignmentFlag=None)
setLabelAlignment(Qt.Alignment=None, Qt.AlignmentFlag=None)
# 间距
setVerticalSpacing(int)
setHorizontalSpacing(int)
spacing() # 获取间距
5.7.2.5 字段增长策略
setFieldGrowthPolicy(QFormLayout.FieldGrowthPolicy)
fieldGrowthPolicy()
该策略请通过查看官方文档获取