当前位置:首页 > 公众号精选 > 码农爱学习

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

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
关闭