Skip to content

布局

主要有四类

  • QBoxLayout
  • QGridLayout
  • QFromLayout
  • QStackedLayout

QBoxLayout

盒子布局

一般使用的是他的两个子类QVBoxLayout(vertical垂直) QHBoxLayout(horizontal水平), 负责垂直以及水平布局

python
from PyQt5.QtWidgets import QWidget, QApplication, QPushButton, QVBoxLayout
import sys

class MyWidget(QWidget):
    def __init__(self):
        super().__init__()

        self.resize(200, 300)
        self.setWindowTitle("hello world")
		# 获取一个垂直布局器
        layout = QVBoxLayout()
        btn1 = QPushButton('按钮1')
        layout.addWidget(btn1)

        btn2 = QPushButton('按钮2')
        layout.addWidget(btn2)

        btn3 = QPushButton('按钮3')
        layout.addWidget(btn3)
		# Strectch 伸展张开, 不加这个的话这三个按键平均分布
        # 可以把这一个想象为一个弹簧, 这一个弹簧在最下面
        # 这一个参数是比例关系
        layout.addStretch(2)

        self.setLayout(layout)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    widget = MyWidget()
    widget.show()
    app.exec()

image-20240507123204699

python
from PyQt5.QtWidgets import *
import sys

class MyWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        container = QVBoxLayout()
        # 第一个子框架
        hobby_box = QGroupBox("爱好")
        v_layout = QVBoxLayout()

        btn1 = QRadioButton("抽烟")
        btn2 = QRadioButton("喝酒")
        btn3 = QRadioButton("打麻将")

        v_layout.addWidget(btn1)
        v_layout.addWidget(btn2)
        v_layout.addWidget(btn3)
		# 给他设置一个布局
        hobby_box.setLayout(v_layout)
		# 另一个框
        gender_box = QGroupBox("性别")
        h_layout = QHBoxLayout()

        btn4 = QRadioButton("男")
        btn5 = QRadioButton("女")

        h_layout.addWidget(btn4)
        h_layout.addWidget(btn5)

        gender_box.setLayout(h_layout)

        container.addWidget(hobby_box)
        container.addWidget(gender_box)
        self.setLayout(container)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    widget = MyWidget()
    widget.show()
    app.exec()

image-20240507125821002

函数

添加组件

python
layout.addWidget(btn3)

添加弹簧

python
# Strectch 伸展张开, 不加这个的话这三个按键平均分布
# 可以把这一个想象为一个弹簧, 这一个弹簧在最下面
# 这一个参数是比例关系
layout.addStretch(2)

QGridLayout

Qt学习之路14--布局管理器(QGridLayout)_qtwidgets.qgridlayout()setspacing(0)-CSDN博客

这一个是九宫格布局, 设置的时候需要给出行号以及列号

python
from PyQt5.QtWidgets import *
import sys

class MyWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        self.setWindowTitle("计算器")

        data = {
            0: ["7", "8", "9", "+", "("], 
            1: ["4", "5", "6", "-", ")"], 
            2: ["1", "2", "3", "*", "<-"], 
            3: ["0", ".", "=", "/", "C"]
        }
		# 总的布局
        layout = QVBoxLayout()
		# 文本框
        edit = QLineEdit()
        edit.setPlaceholderText("请输入")

        layout.addWidget(edit)

        grid = QGridLayout()
        for lint_number, line_data in data.items():
            for col_number, number in enumerate(line_data):
                btn = QPushButton(number)
                # 设置按键布局
                grid.addWidget(btn, lint_number, col_number)

        layout.addLayout(grid)
        self.setLayout(layout)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    widget = MyWidget()
    widget.show()
    app.exec()

image-20240507131700410

QFormLayout

适用于提交数据form表单, 比如登录, 注册之类的场景

QFormLayout是label-field式的表单布局,其目标是提供表单方式的布局,主要由两列构成,第一列一般叫做label域,用于显示提示信息;第二列一般叫做field域,需要用户进行选择,输入,点击等交互操作。

QFormLayout常用方法:

  • addRow(): 添加一行,包括标签(label)和域(field)
  • insertRow(): 插入一行
  • removeRow(): 移除一行
  • setItem(): 在指定行,指定角色位置设置一个QLayoutItem项
  • setWidget(): 在指定行,指定角色位置设置一个部件
  • setLayout: 在指定行,指定角色位置设置一个布局
python
import sys
from PyQt5.QtWidgets import QLabel, QWidget, QApplication, QTextEdit, QLineEdit, QFormLayout

"""
表单布局 QFormLayout

"""


class QFormLayoutDemo(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('表单布局')
        self.resize(600, 400)
        f_layout = QFormLayout(self)

        title_label = QLabel('标题')
        author_label = QLabel('作者')
        content_label = QLabel('内容')

        title_line = QLineEdit()
        author_line = QLineEdit()
        content_text = QTextEdit()

        f_layout.addRow(title_label, title_line)  # 添加行
        f_layout.addRow(author_label, author_line)
        f_layout.addRow(content_label, content_text)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = QFormLayoutDemo()
    w.show()
    app.exec()

image-20240507214102423

QStackedLayout

抽屉布局, 有不同的东西需要显示, 通过选择显示不同的页面, 在同一个位置进行显示