Day 06——QCheckBox(复选框)与 QRadioButton(单选框)

今天学习的是 选择类控件,它们经常一起出现在表单、问卷或配置界面。


一、QCheckBox(复选框)

1. 概念

QCheckBox 用来表示“是否选中”的状态,可以有多个同时选中。
例如:兴趣爱好选择(音乐、运动、阅读)。

状态有三种:

  • 未选中(Unchecked)

  • 选中(Checked)

  • 半选中(PartiallyChecked,可选,可用于多层选择树结构)


2. 常见方法

  • setChecked(True/False):设置选中状态。

  • isChecked():获取当前是否被选中。

  • 信号 stateChanged:当状态改变时触发(返回 0/2)。


3. 示例代码

  

import sys
from PyQt6.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout, QCheckBox

class CheckBoxDemo(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("day06 - checkbox demo")
        self.resize(300,200)

        layout = QVBoxLayout()

        self.lable = QLabel("请选择你的兴趣爱好:", self)
        layout.addWidget(self.lable)

        self.cb_music = QCheckBox("音乐")
        self.cb_sport = QCheckBox("篮球")
        self.cb_drink = QCheckBox("茶")

        layout.addWidget(self.cb_drink)
        layout.addWidget(self.cb_music)
        layout.addWidget(self.cb_sport)

        # 添加信号槽
        self.cb_drink.stateChanged.connect(self.update_hobby)
        self.cb_music.stateChanged.connect(self.update_hobby)
        self.cb_sport.stateChanged.connect(self.update_hobby)

        self.setLayout(layout)

    def update_hobby(self):
        select = []
        if self.cb_drink.isChecked():
            select.append(self.cb_drink.text())
        if self.cb_music.isChecked():
            select.append(self.cb_music.text())
        if self.cb_sport.isChecked():
            select.append(self.cb_sport.text())

        if select:
            self.lable.setText("你选择了" + "、".join(select))
        else:
            self.lable.setText(f"你没有做任何选择!")

# 程序入口
if __name__ == "__main__":
    app = QApplication(sys.argv)

    demo = CheckBoxDemo()

    demo.show()

    sys.exit(app.exec())

运行效果如下:

  image


二、QRadioButton(单选框)

1. 概念

QRadioButton 用来表示一组互斥的选项,只能选一个。
例如:性别选择(男/女)。

如果想实现“只能选一个”,需要把它们放在同一个布局或 QButtonGroup 里。


2. 常见方法

  • setChecked(True):设置默认选中。

  • isChecked():判断是否被选中。

  • 信号 toggled:当按钮被选中/取消时触发。


3. 示例代码

  

import sys
from PyQt6.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout, QHBoxLayout, QRadioButton

class RadioButtonDemo(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("day06 - RadioButton Demo")
        self.resize(200,100)

        layout = QVBoxLayout()

        self.label = QLabel("请选择你的性别:", self)
        layout.addWidget(self.label)

        radio_layout = QHBoxLayout()
        self.ra_male = QRadioButton("男")
        self.ra_female = QRadioButton("女")
        radio_layout.addWidget(self.ra_male)
        radio_layout.addWidget(self.ra_female)

        self.ra_male.toggled.connect(self.update_text)
        self.ra_female.toggled.connect(self.update_text)

        self.ra_male.setChecked(True)

        layout.addLayout(radio_layout)

        self.setLayout(layout)

    def update_text(self):
        if self.ra_male.isChecked():
            self.label.setText("你选择了男性")
        elif self.ra_female.isChecked():
            self.label.setText("你选择了女性")

if __name__ == "__main__":
    app = QApplication(sys.argv)

    demo = RadioButtonDemo()

    demo.show()

    sys.exit(app.exec())
        

运行后的效果如下:

  image


练习任务:做一个 “注册信息选择表单”

  • 上面:性别选择(QRadioButton)。

  • 下面:兴趣爱好选择(QCheckBox)。

  • 点击提交按钮时:弹出一个 QMessageBox,显示选择的性别和爱好。


import sys
from PyQt6.QtWidgets import (QApplication, QLabel, QVBoxLayout, QHBoxLayout, QRadioButton,
                             QWidget, QCheckBox, QPushButton, QMessageBox)

class FormDemo(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("day06 - 表单提交")
        self.resize(300, 300)
        layout = QVBoxLayout()

        self.gender_label = QLabel("请选择性别:", self)
        layout.addWidget(self.gender_label)

        gender_layout = QHBoxLayout()
        self.ra_male = QRadioButton("男")
        self.ra_female = QRadioButton("女")

        gender_layout.addWidget(self.ra_male)
        gender_layout.addWidget(self.ra_female)
        layout.addLayout(gender_layout)

        self.hobby_label = QLabel("请选择你的爱好:", self)
        layout.addWidget(self.hobby_label)

        self.cb_music = QCheckBox("音乐")
        self.cb_read = QCheckBox("读书")
        self.cb_sport = QCheckBox("运动")
        self.cb_tv = QCheckBox("看电视")
        self.cb_movie = QCheckBox("刷视频")

        layout.addWidget(self.cb_movie)
        layout.addWidget(self.cb_music)
        layout.addWidget(self.cb_read)
        layout.addWidget(self.cb_sport)
        layout.addWidget(self.cb_tv)

        self.button = QPushButton("提交")
        self.button.clicked.connect(self.on_submit)
        layout.addWidget(self.button)

        self.setLayout(layout)

    def on_submit(self):
        gender = "男" if self.ra_male.isChecked() else "女"

        hobby_select = []
        if self.cb_movie.isChecked():
            hobby_select.append(self.cb_movie.text())
        if self.cb_music.isChecked():
            hobby_select.append(self.cb_music.text())
        if self.cb_read.isChecked():
            hobby_select.append(self.cb_read.text())
        if self.cb_sport.isChecked():
            hobby_select.append(self.cb_sport.text())
        if self.cb_tv.isChecked():
            hobby_select.append(self.cb_tv.text())

        hobby_text = "、".join(hobby_select) if hobby_select else "没有选择兴趣爱好"
        
        msg = QMessageBox()
        msg.setWindowTitle("注册信息")
        msg.setText(f"你的性别是:{gender},你的兴趣爱好是:{hobby_text}")
        msg.setStandardButtons(QMessageBox.StandardButton.Ok | QMessageBox.StandardButton.Cancel)
        result = msg.exec()

        if result == QMessageBox.StandardButton.Ok:
            print("表单提交成功")
            QApplication.exit()
        else:
            print("取消表单提交")

if __name__ == "__main__":
    app = QApplication(sys.argv)

    demo = FormDemo()

    demo.show()

    sys.exit(app.exec())

运行效果:

  1. 用户选择性别(男/女)。

  2. 用户勾选兴趣爱好(音乐/运动/阅读)。

  3. 点击提交,弹出一个 QMessageBox 显示用户选择的性别和兴趣爱好。

image

posted @ 2025-09-11 18:17  毛豆*_*  阅读(89)  评论(0)    收藏  举报