PyQt5常用控件(二):复选框单选框下拉框

寒烟似雪
1年前发布 /正在检测是否收录...

PyQt5常用基础控件(二):复选框、单选框与下拉框

哈喽~ 欢迎来到PyQt5从入门到精通的第四篇!上一篇我们掌握了标签、按钮、输入框这三个核心基础控件,这一篇聚焦进阶基础控件——QCheckBox复选框、QRadioButton单选框、QComboBox下拉框,这三类控件是“选择类交互”的核心(比如选择性别、爱好、职业),全程代码完整可直接运行,还会做一个“个人信息选择”综合案例,新手也能轻松掌握!
mjqzsti2.png

一、核心控件详解:每个控件的用法+完整代码

这三类控件的核心作用是让用户做选择,但适用场景不同:单选框(二选一/多选一)、复选框(多选多)、下拉框(大量选项的精简选择),我们逐个拆解。

1. QCheckBox:复选框(多选多)

QCheckBox用于允许多选的场景(比如选择爱好:读书、运动、听歌),支持“选中/未选中”状态,还能监听状态变化。

完整代码:QCheckBox常用用法

mjqzttv2.png

import sys
from PyQt5.QtWidgets import (
    QApplication, QWidget, QCheckBox, QVBoxLayout,
    QLabel, QPushButton
)
from PyQt5.QtCore import Qt

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

    def init_ui(self):
        self.setWindowTitle("QCheckBox复选框演示")
        self.resize(350, 250)

        layout = QVBoxLayout()
        layout.setSpacing(15)
        layout.setContentsMargins(50, 40, 50, 40)

        # 提示标签
        self.tip_label = QLabel("请选择你的爱好(可多选):")
        layout.addWidget(self.tip_label)

        # 1. 创建复选框
        self.check1 = QCheckBox("读书")
        self.check2 = QCheckBox("运动")
        self.check3 = QCheckBox("听歌")
        self.check4 = QCheckBox("编程")

        # 可选:设置默认选中状态
        self.check4.setChecked(True)

        # 绑定状态变化信号(选中/取消选中时触发)
        self.check1.stateChanged.connect(self.on_check_change)
        self.check2.stateChanged.connect(self.on_check_change)
        self.check3.stateChanged.connect(self.on_check_change)
        self.check4.stateChanged.connect(self.on_check_change)

        # 添加到布局
        layout.addWidget(self.check1)
        layout.addWidget(self.check2)
        layout.addWidget(self.check3)
        layout.addWidget(self.check4)

        # 按钮:获取选中的爱好
        get_btn = QPushButton("获取选中的爱好")
        get_btn.clicked.connect(self.get_checked_hobbies)
        layout.addWidget(get_btn)

        # 结果显示标签
        self.result_label = QLabel("已选中:编程")
        layout.addWidget(self.result_label)

        self.setLayout(layout)

    # 复选框状态变化槽函数
    def on_check_change(self, state):
        # state:2=选中,0=未选中
        sender = self.sender()  # 获取触发信号的复选框
        if state == Qt.Checked:
            print(f"选中了:{sender.text()}")
        else:
            print(f"取消选中:{sender.text()}")

    # 获取所有选中的爱好
    def get_checked_hobbies(self):
        hobbies = []
        if self.check1.isChecked():
            hobbies.append(self.check1.text())
        if self.check2.isChecked():
            hobbies.append(self.check2.text())
        if self.check3.isChecked():
            hobbies.append(self.check3.text())
        if self.check4.isChecked():
            hobbies.append(self.check4.text())
        
        if hobbies:
            self.result_label.setText(f"已选中:{', '.join(hobbies)}")
        else:
            self.result_label.setText("未选中任何爱好")

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

QCheckBox关键方法解析

方法作用
setChecked(True)设置默认选中状态(False为未选中)
isChecked()判断是否选中(返回True/False)
stateChanged.connect(槽函数)监听状态变化(选中/取消选中)
text()获取复选框的文本内容
sender()在槽函数中获取触发信号的控件(区分多个复选框)

2. QRadioButton:单选框(多选一)

QRadioButton用于只能选一个的场景(比如性别:男/女),核心是必须分组(QButtonGroup),否则多个单选框不会互斥(能同时选中)。

完整代码:QRadioButton常用用法

mjqzusvk.png

import sys
from PyQt5.QtWidgets import (
    QApplication, QWidget, QRadioButton, QVBoxLayout,
    QLabel, QPushButton, QButtonGroup
)

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

    def init_ui(self):
        self.setWindowTitle("QRadioButton单选框演示")
        self.resize(350, 200)

        layout = QVBoxLayout()
        layout.setSpacing(15)
        layout.setContentsMargins(50, 40, 50, 40)

        # 提示标签
        self.tip_label = QLabel("请选择你的性别(只能选一个):")
        layout.addWidget(self.tip_label)

        # 1. 创建单选框分组(核心!否则单选框不互斥)
        self.radio_group = QButtonGroup(self)

        # 2. 创建单选框
        self.radio1 = QRadioButton("男")
        self.radio2 = QRadioButton("女")
        self.radio3 = QRadioButton("保密")

        # 3. 将单选框加入分组
        self.radio_group.addButton(self.radio1, 1)  # 第二个参数是自定义ID,可选
        self.radio_group.addButton(self.radio2, 2)
        self.radio_group.addButton(self.radio3, 3)

        # 可选:设置默认选中
        self.radio3.setChecked(True)

        # 绑定选中变化信号
        self.radio_group.buttonClicked.connect(self.on_radio_click)

        # 添加到布局
        layout.addWidget(self.radio1)
        layout.addWidget(self.radio2)
        layout.addWidget(self.radio3)

        # 按钮:获取选中的性别
        get_btn = QPushButton("获取选中的性别")
        get_btn.clicked.connect(self.get_checked_gender)
        layout.addWidget(get_btn)

        # 结果显示标签
        self.result_label = QLabel("已选中:保密")
        layout.addWidget(self.result_label)

        self.setLayout(layout)

    # 单选框点击槽函数
    def on_radio_click(self, radio_btn):
        # radio_btn是被点击的单选框对象
        print(f"选中了性别:{radio_btn.text()}")

    # 获取选中的性别
    def get_checked_gender(self):
        # 方式1:通过分组获取选中的按钮
        checked_btn = self.radio_group.checkedButton()
        if checked_btn:
            self.result_label.setText(f"已选中:{checked_btn.text()}")
        else:
            self.result_label.setText("未选中任何性别")

        # 方式2:逐个判断(不推荐,分组更高效)
        # if self.radio1.isChecked():
        #     self.result_label.setText("已选中:男")
        # elif self.radio2.isChecked():
        #     self.result_label.setText("已选中:女")
        # elif self.radio3.isChecked():
        #     self.result_label.setText("已选中:保密")

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

QRadioButton关键要点

  1. 必须分组:用QButtonGroup管理单选框,否则多个单选框可同时选中;
  2. 核心方法

    方法作用
    QButtonGroup.addButton(单选框, ID)将单选框加入分组
    radio_group.checkedButton()获取分组中选中的单选框
    setChecked(True)设置默认选中
    isChecked()判断是否选中

3. QComboBox:下拉选择框(精简多选一)

QComboBox用于选项较多、需要精简界面的场景(比如选择职业、城市),支持下拉展开选择,也能设置可编辑(允许用户输入)。

完整代码:QComboBox常用用法

mjqzvsjb.png

import sys
from PyQt5.QtWidgets import (
    QApplication, QWidget, QComboBox, QVBoxLayout,
    QLabel, QPushButton
)

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

    def init_ui(self):
        self.setWindowTitle("QComboBox下拉框演示")
        self.resize(350, 200)

        layout = QVBoxLayout()
        layout.setSpacing(15)
        layout.setContentsMargins(50, 40, 50, 40)

        # 提示标签
        self.tip_label = QLabel("请选择你的职业:")
        layout.addWidget(self.tip_label)

        # 1. 创建下拉框
        self.combo = QComboBox()

        # 2. 添加选项(三种方式)
        # 方式1:逐个添加
        self.combo.addItem("学生")
        self.combo.addItem("程序员")
        self.combo.addItem("教师")
        # 方式2:批量添加
        self.combo.addItems(["设计师", "医生", "自由职业者"])
        # 方式3:添加带自定义数据的选项(文本+值)
        self.combo.addItem("其他", "other")

        # 可选设置
        self.combo.setCurrentIndex(1)  # 设置默认选中第2个选项(索引从0开始)
        # self.combo.setEditable(True)  # 允许用户输入自定义内容

        # 绑定选中变化信号
        self.combo.currentIndexChanged.connect(self.on_combo_change)  # 索引变化
        # self.combo.currentTextChanged.connect(self.on_text_change)  # 文本变化

        layout.addWidget(self.combo)

        # 按钮:获取选中的职业
        get_btn = QPushButton("获取选中的职业")
        get_btn.clicked.connect(self.get_checked_job)
        layout.addWidget(get_btn)

        # 结果显示标签
        self.result_label = QLabel("已选中:程序员")
        layout.addWidget(self.result_label)

        self.setLayout(layout)

    # 下拉框索引变化槽函数
    def on_combo_change(self, index):
        # index是选中项的索引
        text = self.combo.itemText(index)  # 通过索引获取文本
        data = self.combo.itemData(index)  # 获取自定义数据(没有则返回None)
        print(f"选中索引:{index},职业:{text},自定义数据:{data}")

    # # 文本变化槽函数(当setEditable=True时常用)
    # def on_text_change(self, text):
    #     print(f"选中/输入的职业:{text}")

    # 获取选中的职业
    def get_checked_job(self):
        # 方式1:获取选中的文本
        text = self.combo.currentText()
        # 方式2:获取选中的索引
        index = self.combo.currentIndex()
        # 方式3:获取自定义数据
        data = self.combo.currentData()

        self.result_label.setText(f"职业:{text}(索引:{index},自定义数据:{data})")

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

QComboBox关键方法

方法作用
addItem("文本", 自定义数据)添加单个选项
addItems(["选项1", "选项2"])批量添加选项
setCurrentIndex(索引)设置默认选中项(索引从0开始)
currentText()获取选中的文本
currentIndex()获取选中的索引
setEditable(True)允许用户输入自定义内容

二、综合案例:个人信息选择窗口(完整代码)

结合复选框、单选框、下拉框,做一个实用的“个人信息填写窗口”——包含性别单选、爱好复选、职业下拉,点击“提交”按钮后显示所有选中的信息,界面美化且逻辑完整。
mjqzxjc5.png

import sys
from PyQt5.QtWidgets import (
    QApplication, QWidget, QLabel, QRadioButton,
    QCheckBox, QComboBox, QPushButton, QVBoxLayout,
    QHBoxLayout, QGroupBox, QButtonGroup
)
from PyQt5.QtGui import QFont
from PyQt5.QtCore import Qt

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

    def init_ui(self):
        # 窗口基础设置
        self.setWindowTitle("个人信息选择窗口")
        self.resize(450, 400)
        self.setStyleSheet("""
            QWidget {
                font-size: 14px;
                color: #2c3e50;
            }
            QGroupBox {
                font-weight: bold;
                border: 1px solid #bdc3c7;
                border-radius: 6px;
                margin-top: 10px;
                padding-top: 10px;
            }
            QPushButton {
                background-color: #27ae60;
                color: white;
                padding: 8px 16px;
                border: none;
                border-radius: 4px;
            }
            QPushButton:hover {
                background-color: #219653;
            }
        """)

        # 主布局(垂直)
        main_layout = QVBoxLayout()
        main_layout.setSpacing(20)
        main_layout.setContentsMargins(40, 30, 40, 30)

        # 1. 性别分组(QGroupBox美化分组)
        gender_group = QGroupBox("性别")
        gender_layout = QHBoxLayout()
        # 单选框分组
        self.gender_btn_group = QButtonGroup()
        self.radio_male = QRadioButton("男")
        self.radio_female = QRadioButton("女")
        self.radio_secret = QRadioButton("保密")
        self.gender_btn_group.addButton(self.radio_male)
        self.gender_btn_group.addButton(self.radio_female)
        self.gender_btn_group.addButton(self.radio_secret)
        # 默认选中保密
        self.radio_secret.setChecked(True)
        # 添加到性别布局
        gender_layout.addWidget(self.radio_male)
        gender_layout.addWidget(self.radio_female)
        gender_layout.addWidget(self.radio_secret)
        gender_group.setLayout(gender_layout)
        main_layout.addWidget(gender_group)

        # 2. 爱好分组
        hobby_group = QGroupBox("爱好(可多选)")
        hobby_layout = QHBoxLayout()
        # 复选框
        self.check_read = QCheckBox("读书")
        self.check_sport = QCheckBox("运动")
        self.check_music = QCheckBox("听歌")
        self.check_code = QCheckBox("编程")
        # 添加到爱好布局
        hobby_layout.addWidget(self.check_read)
        hobby_layout.addWidget(self.check_sport)
        hobby_layout.addWidget(self.check_music)
        hobby_layout.addWidget(self.check_code)
        hobby_group.setLayout(hobby_layout)
        main_layout.addWidget(hobby_group)

        # 3. 职业分组
        job_group = QGroupBox("职业")
        job_layout = QHBoxLayout()
        # 下拉框
        self.combo_job = QComboBox()
        self.combo_job.addItems(["学生", "程序员", "教师", "设计师", "医生", "其他"])
        job_layout.addWidget(QLabel("选择:"))
        job_layout.addWidget(self.combo_job)
        job_group.setLayout(job_layout)
        main_layout.addWidget(job_group)

        # 4. 提交按钮
        submit_btn = QPushButton("提交信息")
        submit_btn.clicked.connect(self.submit_info)
        main_layout.addWidget(submit_btn, alignment=Qt.AlignCenter)

        # 5. 结果显示标签
        self.result_label = QLabel("")
        self.result_label.setStyleSheet("color: #e67e22; margin-top: 10px;")
        self.result_label.setAlignment(Qt.AlignCenter)
        main_layout.addWidget(self.result_label)

        # 绑定主布局
        self.setLayout(main_layout)

    # 提交信息槽函数
    def submit_info(self):
        # 1. 获取性别
        gender = self.gender_btn_group.checkedButton().text()

        # 2. 获取爱好
        hobbies = []
        if self.check_read.isChecked():
            hobbies.append(self.check_read.text())
        if self.check_sport.isChecked():
            hobbies.append(self.check_sport.text())
        if self.check_music.isChecked():
            hobbies.append(self.check_music.text())
        if self.check_code.isChecked():
            hobbies.append(self.check_code.text())
        hobby_text = ", ".join(hobbies) if hobbies else "无"

        # 3. 获取职业
        job = self.combo_job.currentText()

        # 4. 显示结果
        result = f"""
        提交的信息:
        性别:{gender}
        爱好:{hobby_text}
        职业:{job}
        """
        self.result_label.setText(result)

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

综合案例亮点

  1. QGroupBox对控件分组,界面更规整、易读;
  2. 结合了三类选择控件,覆盖“单选、多选、下拉选”所有常用选择场景;
  3. 加入样式美化(按钮悬停、分组边框、字体颜色);
  4. 逻辑完整:提交后整合所有选中信息并显示,新手可直接复用。

三、常见问题排查

  1. 单选框不互斥

    • 未使用QButtonGroup分组,只需将所有单选框加入同一个分组即可;
    • 分组时误将单选框加入不同分组(比如创建了多个QButtonGroup)。
  2. 复选框无法获取选中状态

    • 槽函数中未正确调用isChecked(),或控件实例名写错(比如check1写成check_1);
    • 复选框被禁用(setDisabled(True)),导致无法选中。
  3. 下拉框选项不显示

    • 忘记调用addItem()/addItems()添加选项;
    • 下拉框尺寸太小(可通过setMinimumWidth(100)设置最小宽度)。
  4. 提交后结果不显示

    • 槽函数未绑定到按钮的clicked信号;
    • 结果标签被布局遮挡(可调整setContentsMarginsspacing)。

      总结

  5. 三类选择控件的核心场景:QRadioButton(单选)、QCheckBox(多选)、QComboBox(精简单选);
  6. 单选框必须用QButtonGroup分组,否则无法实现互斥;
  7. 复选框通过isChecked()判断状态,下拉框通过currentText()获取选中内容;
  8. 实际开发中用QGroupBox分组控件,可提升界面可读性;
  9. 下一篇我们会讲解阶段一实战项目:仿照记事本界面开发简易文本编辑器,记得关注字节曜博客哦~

如果在实操中遇到问题,欢迎在评论区留言讨论!

© 版权声明
THE END
喜欢就支持一下吧
点赞 0 分享 收藏
评论 抢沙发
OωO
取消
SSL