day07——QGroupBox 分组框
今天我们开始触摸 PyQt 的一个“重量级武器”——布局管理器的组合应用 + QGroupBox 分组框。
昨天我们已经学过 QVBoxLayout、QHBoxLayout 的基本布局。今天要让你的窗口像“专业软件”一样整齐有层次。
学习目标
-
理解 QGroupBox(分组框) 的作用与用法
-
掌握 布局嵌套 的概念(layout inside layout)
-
学会使用 QGridLayout(网格布局)
-
编写一个“用户信息录入界面”,带分组、布局、按钮操作
概念讲解
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:用于整体排布
-
信号槽机制:按钮触发对应函数(提交 / 清空)
您的资助是我最大的动力!
金额随意,欢迎来赏!

浙公网安备 33010602011771号