pyQt实现控件的展示与隐藏
时间:2026-10-22 22:03:12
本篇使用pyQt来实现一种根据勾选框是否选中,关联指定控件是否展示的逻辑。
1 功能说明
如下图的展示效果:
- 勾选框选中时,会显示项目1、项目2、项目3
- 勾选框取消选着后,对应的展示被隐藏,同时整体的布局会重新自适应调整(下面的文本输入区域会上移)
功能通过勾选框的方式展示,可以多选需要的功能。

2 代码实现
对于上述需求,通过pyQt来实现界面以及界面中的控件:
- 对于勾选框,使用QCheckBox组件
- 对于项目文字展示,使用QLabel组件
- 对于将一类组件集合为一个组展示,使用QGroupBox组件
- 对于文本框的展示,使用QTextEdit组件
- 对于每组内组件的水平与垂直布局,使用 QHBoxLayout与 QVBoxLayout布局
组件有了之后,如何实现勾选框的是否切换,来影响文字组件是否隐藏或展示,是一个关键点,下面给出思路:
- 控件本身是不支持隐藏的,但可以把控件放到QWidget中
- 通过QWidget的setVisible方法,来实现隐藏与展示
2.1 关键代码
def initUI(self):
# 创建复选框(控制开关)
self.checkbox = QCheckBox('显示水平布局', self)
self.checkbox.setChecked(True) # 默认选中(组件初始显示)
# 绑定复选框状态变化信号到槽函数(核心:状态变则触发控制)
self.checkbox.stateChanged.connect(self.on_checkbox_changed)
# 创建需要被控制显示/隐藏的目标组件(这里是包装了水平布局的容器)
self.target_layout = QHBoxLayout()
self.target_layout.addWidget(QLabel('项目 1'))
self.target_layout.addWidget(QLabel('项目 2'))
self.target_layout.addWidget(QLabel('项目 3'))
# 用QWidget作为布局容器(布局本身不能直接显示/隐藏,需通过容器载体)
self.layout_container = QWidget()
self.layout_container.setLayout(self.target_layout)
# 复选框状态变化的槽函数(核心控制逻辑)
def on_checkbox_changed(self, state):
self.layout_container.setVisible(state == Qt.Checked)
说明:
- 创建控制开关(QCheckBox):定义复选框,设置初始选中状态。
- 绑定信号与槽:通过
stateChanged.connect(槽函数)关联复选框状态变化事件,状态变则触发控制逻辑。 - 包装目标组件(容器载体):由于布局(如 QHBoxLayout)不能直接调用
setVisible(),需用QWidget作为容器,将布局设置到容器中,通过控制容器的显示 / 隐藏间接控制布局内所有组件。 - 槽函数控制显示 / 隐藏:在槽函数中接收复选框状态(
state),通过setVisible(True/False)控制目标容器的显示状态(Qt.Checked对应选中状态
2.2 完整代码
完整的代码如下:
import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QCheckBox,
QHBoxLayout, QVBoxLayout, QLabel,
QTextEdit, QGroupBox)
from PyQt5.QtCore import Qt
class LayoutControlDemo(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
# 窗口基本设置
self.setWindowTitle('CheckBox Test')
self.setGeometry(100, 100, 300, 200)
# 主布局(垂直布局,分为上半部分和下半部分)
main_layout = QVBoxLayout()
# ---------------------- 上半部分:复选框 + 可控水平布局 ----------------------
# 创建上半部分的容器(可选,用于与下半部分区分)
top_group = QGroupBox("布局控制区域") # 带标题的边框容器
top_layout = QVBoxLayout() # 上半部分内部布局
# 复选框(控制水平布局显示)
self.checkbox = QCheckBox('显示水平布局', self)
self.checkbox.setChecked(True)
self.checkbox.stateChanged.connect(self.on_checkbox_changed)
top_layout.addWidget(self.checkbox)
# 被控制的水平布局(包装在容器中)
self.target_layout = QHBoxLayout()
self.target_layout.addWidget(QLabel('项目 1', self))
self.target_layout.addWidget(QLabel('项目 2', self))
self.target_layout.addWidget(QLabel('项目 3', self))
self.layout_container = QWidget()
self.layout_container.setLayout(self.target_layout)
top_layout.addWidget(self.layout_container)
# 将上半部分布局设置到容器中
top_group.setLayout(top_layout)
main_layout.addWidget(top_group) # 添加到主布局
# ---------------------- 下半部分:文本框框架 ----------------------
# 创建带边框的文本框容器
bottom_group = QGroupBox("文本输入区域") # 带标题的边框容器
bottom_layout = QVBoxLayout() # 下半部分内部布局
# 添加文本框(支持多行输入)
self.text_edit = QTextEdit()
self.text_edit.setPlaceholderText("请在此输入文本...") # 提示文字
bottom_layout.addWidget(self.text_edit)
# 将下半部分布局设置到容器中
bottom_group.setLayout(bottom_layout)
# 设置下半部分占比(通过拉伸因子调整,这里上下比例约为 1:1)
main_layout.addWidget(bottom_group, stretch=1)
# 设置窗口主布局
self.setLayout(main_layout)
def on_checkbox_changed(self, state):
# 控制水平布局容器的显示/隐藏
self.layout_container.setVisible(state == Qt.Checked)
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = LayoutControlDemo()
demo.show()
sys.exit(app.exec_())
最终的运行效果:

3总结
本篇使用pyQt来实现了一种通过勾选框控制相关组件是否展示的逻辑,首先介绍了功能,然后分析代码的实现逻辑,最后给出运行效果。





