PyQt5常用基础控件(二):复选框、单选框与下拉框
哈喽~ 欢迎来到PyQt5从入门到精通的第四篇!上一篇我们掌握了标签、按钮、输入框这三个核心基础控件,这一篇聚焦进阶基础控件——QCheckBox复选框、QRadioButton单选框、QComboBox下拉框,这三类控件是“选择类交互”的核心(比如选择性别、爱好、职业),全程代码完整可直接运行,还会做一个“个人信息选择”综合案例,新手也能轻松掌握!
一、核心控件详解:每个控件的用法+完整代码
这三类控件的核心作用是让用户做选择,但适用场景不同:单选框(二选一/多选一)、复选框(多选多)、下拉框(大量选项的精简选择),我们逐个拆解。
1. QCheckBox:复选框(多选多)
QCheckBox用于允许多选的场景(比如选择爱好:读书、运动、听歌),支持“选中/未选中”状态,还能监听状态变化。
完整代码:QCheckBox常用用法

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常用用法

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关键要点
- 必须分组:用
QButtonGroup管理单选框,否则多个单选框可同时选中; 核心方法:
方法 作用 QButtonGroup.addButton(单选框, ID)将单选框加入分组 radio_group.checkedButton()获取分组中选中的单选框 setChecked(True)设置默认选中 isChecked()判断是否选中
3. QComboBox:下拉选择框(精简多选一)
QComboBox用于选项较多、需要精简界面的场景(比如选择职业、城市),支持下拉展开选择,也能设置可编辑(允许用户输入)。
完整代码:QComboBox常用用法

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) | 允许用户输入自定义内容 |
二、综合案例:个人信息选择窗口(完整代码)
结合复选框、单选框、下拉框,做一个实用的“个人信息填写窗口”——包含性别单选、爱好复选、职业下拉,点击“提交”按钮后显示所有选中的信息,界面美化且逻辑完整。
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_())综合案例亮点
- 用
QGroupBox对控件分组,界面更规整、易读; - 结合了三类选择控件,覆盖“单选、多选、下拉选”所有常用选择场景;
- 加入样式美化(按钮悬停、分组边框、字体颜色);
- 逻辑完整:提交后整合所有选中信息并显示,新手可直接复用。
三、常见问题排查
单选框不互斥:
- 未使用
QButtonGroup分组,只需将所有单选框加入同一个分组即可; - 分组时误将单选框加入不同分组(比如创建了多个QButtonGroup)。
- 未使用
复选框无法获取选中状态:
- 槽函数中未正确调用
isChecked(),或控件实例名写错(比如check1写成check_1); - 复选框被禁用(
setDisabled(True)),导致无法选中。
- 槽函数中未正确调用
下拉框选项不显示:
- 忘记调用
addItem()/addItems()添加选项; - 下拉框尺寸太小(可通过
setMinimumWidth(100)设置最小宽度)。
- 忘记调用
提交后结果不显示:
- 槽函数未绑定到按钮的
clicked信号; 结果标签被布局遮挡(可调整
setContentsMargins或spacing)。总结
- 槽函数未绑定到按钮的
- 三类选择控件的核心场景:QRadioButton(单选)、QCheckBox(多选)、QComboBox(精简单选);
- 单选框必须用
QButtonGroup分组,否则无法实现互斥; - 复选框通过
isChecked()判断状态,下拉框通过currentText()获取选中内容; - 实际开发中用
QGroupBox分组控件,可提升界面可读性; - 下一篇我们会讲解阶段一实战项目:仿照记事本界面开发简易文本编辑器,记得关注字节曜博客哦~
如果在实操中遇到问题,欢迎在评论区留言讨论!