day07——QGroupBox 分组框

今天我们开始触摸 PyQt 的一个“重量级武器”——布局管理器的组合应用 + QGroupBox 分组框

昨天我们已经学过 QVBoxLayoutQHBoxLayout 的基本布局。今天要让你的窗口像“专业软件”一样整齐有层次。

学习目标

  1. 理解 QGroupBox(分组框) 的作用与用法

  2. 掌握 布局嵌套 的概念(layout inside layout)

  3. 学会使用 QGridLayout(网格布局)

  4. 编写一个“用户信息录入界面”,带分组、布局、按钮操作

概念讲解

1. QGroupBox 是什么

QGroupBox 就像一个带标题的“区域框”,可以把一组控件包裹在一起。
常见用途:

  • 把“用户信息”、“联系方式”、“设置选项”等分成独立区域。

  • 增强视觉层次感。

使用方式非常简单:

group = QGroupBox("用户信息")
layout = QVBoxLayout()
layout.addWidget(QLabel("姓名:"))
group.setLayout(layout)

2. QGridLayout(网格布局)

QGridLayout 是最灵活的布局器之一,类似 HTML 的表格布局。
语法:

layout.addWidget(widget, row, column, rowSpan, columnSpan)
  • row, column:控件所在的行列

  • rowSpan, columnSpan:跨行、跨列(可选)

布局嵌套(Nested Layout)

布局里还可以放布局!
比如主窗口是 QVBoxLayout,里面上半部分是 QGridLayout(表单),下半部分是 QHBoxLayout(按钮区).

🧩 实战代码:信息录入窗口

import sys
from PyQt6.QtWidgets import (
    QApplication, QMainWindow, QWidget, QLabel, QLineEdit, QTextEdit,
    QGridLayout, QHBoxLayout, QVBoxLayout, QPushButton, QGroupBox, QMessageBox
)


class InfoForm(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("Day 08 - 分组与布局综合应用")
        self.setGeometry(300, 200, 500, 400)

        # 创建中央部件
        central_widget = QWidget()
        self.setCentralWidget(central_widget)

        # 主布局(垂直方向)
        main_layout = QVBoxLayout(central_widget)

        # ========== 用户信息分组框 ==========
        user_group = QGroupBox("基本信息")
        grid = QGridLayout()

        grid.addWidget(QLabel("姓名:"), 0, 0)
        self.name_edit = QLineEdit()
        grid.addWidget(self.name_edit, 0, 1)

        grid.addWidget(QLabel("年龄:"), 1, 0)
        self.age_edit = QLineEdit()
        grid.addWidget(self.age_edit, 1, 1)

        grid.addWidget(QLabel("邮箱:"), 2, 0)
        self.email_edit = QLineEdit()
        grid.addWidget(self.email_edit, 2, 1)

        user_group.setLayout(grid)

        # ========== 备注分组框 ==========
        note_group = QGroupBox("备注")
        note_layout = QVBoxLayout()
        self.note_edit = QTextEdit()
        note_layout.addWidget(self.note_edit)
        note_group.setLayout(note_layout)

        # ========== 按钮区域 ==========
        button_layout = QHBoxLayout()
        submit_btn = QPushButton("提交")
        clear_btn = QPushButton("清空")
        button_layout.addWidget(submit_btn)
        button_layout.addWidget(clear_btn)

        # 添加到主布局
        main_layout.addWidget(user_group)
        main_layout.addWidget(note_group)
        main_layout.addLayout(button_layout)

        # 信号连接
        submit_btn.clicked.connect(self.submit)
        clear_btn.clicked.connect(self.clear_form)

    def submit(self):
        name = self.name_edit.text().strip()
        age = self.age_edit.text().strip()
        email = self.email_edit.text().strip()
        note = self.note_edit.toPlainText().strip()

        if not name or not age or not email:
            QMessageBox.warning(self, "提示", "请填写完整信息!")
            return

        msg = f"姓名:{name}\n年龄:{age}\n邮箱:{email}\n备注:{note}"
        QMessageBox.information(self, "提交成功", msg)

    def clear_form(self):
        self.name_edit.clear()
        self.age_edit.clear()
        self.email_edit.clear()
        self.note_edit.clear()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = InfoForm()
    window.show()
    sys.exit(app.exec())

代码结构说明

  • QGroupBox:逻辑上划分区域(基本信息 / 备注)

  • QGridLayout:用于“标签 + 输入框”结构

  • QVBoxLayout + QHBoxLayout:用于整体排布

  • 信号槽机制:按钮触发对应函数(提交 / 清空)

posted @ 2025-10-23 14:21  毛豆*_*  阅读(43)  评论(0)    收藏  举报