公众号:uncle39py

V1

2023/05/04阅读:11主题:默认主题

90.PyQt布局管理器

前面几节介绍了PyQt最常用的几个基础控件,有:按钮、单行多行文本框、标签,这些暂时可以满足我们做小工具的需求了

本着从大的框架出发来讲解PyQt,所以基础控件的介绍先暂告一段落,后续再补充

本节开始介绍布局管理器

一.布局管理器介绍

1.布局管理器的作用:

  • 以某一种规则将子控件摆在父控件中,这里的规则有:垂直布局/水平布局/表单布局/表格布局这几种;

  • 当可用空间发生改变时,布局管理器会自动调整控件的位置和大小;其中窗口大小改变、内容改变、控件隐藏等都会导致可用空间发生变化

布局管理器的继承结构图如下:

2.布局管理器的简单使用

本质:父控件管布局管理器,布局管理器管子控件

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("布局管理器学习")
        self.resize(500,500)
        self.init_ui()

    def init_ui(self):
        label1 = QLabel("1")# 可以不设置其父控件
        label2 = QLabel("2")
        label3= QLabel("3")
        v_layout = QVBoxLayout() #1.创建布局管理器对象
        v_layout.addWidget(label1) #2.让布局管理器对象接管子控件
        v_layout.addWidget(label2)
        v_layout.addWidget(label3)
        self.setLayout(v_layout) #3.内部会界定父子关系

        #注意点:
        # 1.父控件窗口中,不直接管理子控件,子控件由布局管理器接管
        # 2.子控件可以不设置它的父控件,self.setLayout(v_layout)系统会为v_layout及其里面的控件统一指定父控件self
        # 3.可以通过print(self.children())来验证窗口父控件的子控件:包含布局管理器及三个标签

二.基类QLayout

  • addWidget()往布局内添加控件

  • addLayout()布局的嵌套:往布局内添加布局

  • setContentsMargins(...)设置布局管理器与父控件的间距

  • setSpacing()设置布局管理器接管的控件互相之间的间距

  • 布局内部的控件可以被另外的控件替换(replaceWidget()),被替换的控件不受布局管理器控制,需要显示的写一条隐藏语句,或者设置被替换的控件的父控件为None(没人引用,会在内存中被清除)

三.QBoxLayout/QHBoxLayout/QVBoxLayout

QBoxLayout:盒子布局,使用的时候需要设置方向:从上到下,从下到上,从左到右,从右到左;我们直接使用它的子类水平布局/垂直布局即可

  • insertWidget(...)插入控件

  • insertLayout(...)插入布局

  • removeWidget(...)移除布局,从标签管理器中移除,移除后的控件不受布局管理器控制,需要显示的写一条隐藏语句,或者设置被移除的控件的父控件为None(没人引用,会在内存中被清除)

  • addSpacing(self,int)添加空白,空白尺寸不随窗口变化

  • insertSpacing(self,int,int)插入空白

以下为重点:QBoxLayout的伸缩因子

QBoxLayout的addWidget(...)方法参数中,默认stretch=0,stretch代表伸缩因子;

含义是:当前控件的空间大小,在整个布局中所有控件的总的空间大小的权重(比例),如果窗口控件变化,每个控件会随着这个权重重新分配空间

QBoxLayout的addStretch(int): 插入空白的空间,大小根据伸缩因子的权重来分配.

特殊情况:当每个控件都没有指定伸缩因子,而控件中间插入了一个伸缩因子:

setStretchFactor(widget/layout,1)重新设置某个控件或子布局的伸缩因子

QHBoxLayout/QVBoxLayout :水平布局/垂直布局,这两个类本身没有新的东西,只是在构造函数中指定了布局的方向为水平/垂直而已

四.表单布局QFormLayout

表单布局直观样子:左边列是标签,右边列是输入框,两列多行,每行为一组;

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QFormLayout")
        self.resize(500,500)
        self.init_ui()

    def init_ui(self):
        name_label=QLabel("姓名")
        age_label=QLabel("年龄")
        name_le=QLineEdit()
        age_le=QLineEdit()
        
        layout = QFormLayout()
        layout.addRow(name_label,name_le)
        layout.addRow(age_label,age_le)
        self.setLayout(layout)

其中添加行的几个方法:

后续如果要修改标签,需要获取到标签对象,方法如下:

label_name = layout.labelForField(name_le)
label_name.setText("xxx")

插入行的几个方法:

setHorizontalSpacing(int)设置列于列的间距

setVerticalSpacing(int)设置行与行的间距

其他操作涉及(用到在查):

  • 获取行信息
  • 修改行
  • 移除行(包含是否删除控件两种方式)
  • 行的包装策略,即:当行的宽度不够大的时候,如何布局标签和字段的位置
  • 字段增长策略,即:当窗口尺寸变大时,字段尺寸是否跟着变大

五.栅格布局(表格布局)

表单布局是两列多行,栅格布局则是多列多行,可以理解成excel表格

设置间距

  • 设置行与行间距setVerticalSpacing(int)
  • 设置列与列间距setHorizontalSpacing(int)
  • 同时设置水平与垂直间距为同一个值setSpacing(int)

设置拉伸因子

需分别设置某行或某列的拉伸因子(即:额外多余空间的分配,详细查看上边QBoxLayout)

涉及两个方法:setColumnStretch(),setRowStretch()

其他操作涉及(用到在查)

  • 获取位置:getItemPosition(self,int)
  • 获取位置对应的控件:itemAtPosition(int row,int column).widget()
  • 设置单元格最小列宽,最小行高
  • 信息获取:行数、列数

分类:

后端

标签:

后端

作者介绍

公众号:uncle39py
V1