4. 复选框与单选按钮

任务目标

创建一个Qt窗口,包含一组复选框(QCheckBox)和一组单选按钮(QRadioButton),当用户切换任意选项时,在窗口底部的标签中实时显示当前所有选项的选择状态。

环境依赖

需要Qt 5或Qt 6开发环境,以及对应的C++编译器。本案例使用Qt Widgets模块,无需额外第三方库。

完整实现代码

#include <QApplication>
#include <QWidget>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QGroupBox>
#include <QCheckBox>
#include <QRadioButton>
#include <QLabel>

class OptionWindow : public QWidget {
    Q_OBJECT
public:
    OptionWindow(QWidget *parent = nullptr) : QWidget(parent) {
        // 创建复选框组
        QGroupBox *checkGroup = new QGroupBox("兴趣爱好", this);
        QVBoxLayout *checkLayout = new QVBoxLayout(checkGroup);
        m_cppCheck = new QCheckBox("C++", checkGroup);
        m_pythonCheck = new QCheckBox("Python", checkGroup);
        m_qtCheck = new QCheckBox("Qt", checkGroup);
        checkLayout->addWidget(m_cppCheck);
        checkLayout->addWidget(m_pythonCheck);
        checkLayout->addWidget(m_qtCheck);

        // 创建单选按钮组
        QGroupBox *radioGroup = new QGroupBox("经验等级", this);
        QVBoxLayout *radioLayout = new QVBoxLayout(radioGroup);
        m_beginnerRadio = new QRadioButton("初级", radioGroup);
        m_intermediateRadio = new QRadioButton("中级", radioGroup);
        m_expertRadio = new QRadioButton("高级", radioGroup);
        m_beginnerRadio->setChecked(true);  // 默认选中
        radioLayout->addWidget(m_beginnerRadio);
        radioLayout->addWidget(m_intermediateRadio);
        radioLayout->addWidget(m_expertRadio);

        // 状态显示标签
        m_statusLabel = new QLabel(this);
        m_statusLabel->setWordWrap(true);

        // 主布局
        QVBoxLayout *mainLayout = new QVBoxLayout(this);
        QHBoxLayout *topLayout = new QHBoxLayout();
        topLayout->addWidget(checkGroup);
        topLayout->addWidget(radioGroup);
        mainLayout->addLayout(topLayout);
        mainLayout->addWidget(m_statusLabel);

        // 连接信号
        connect(m_cppCheck, &QCheckBox::toggled, this, &OptionWindow::updateStatus);
        connect(m_pythonCheck, &QCheckBox::toggled, this, &OptionWindow::updateStatus);
        connect(m_qtCheck, &QCheckBox::toggled, this, &OptionWindow::updateStatus);
        connect(m_beginnerRadio, &QRadioButton::toggled, this, &OptionWindow::updateStatus);
        connect(m_intermediateRadio, &QRadioButton::toggled, this, &OptionWindow::updateStatus);
        connect(m_expertRadio, &QRadioButton::toggled, this, &OptionWindow::updateStatus);

        updateStatus();  // 初始化显示
    }

private slots:
    void updateStatus() {
        QStringList selected;
        if (m_cppCheck->isChecked()) selected << "C++";
        if (m_pythonCheck->isChecked()) selected << "Python";
        if (m_qtCheck->isChecked()) selected << "Qt";

        QString level;
        if (m_beginnerRadio->isChecked()) level = "初级";
        else if (m_intermediateRadio->isChecked()) level = "中级";
        else if (m_expertRadio->isChecked()) level = "高级";

        QString checkText = selected.isEmpty() ? "无" : selected.join("、");
        m_statusLabel->setText(QString("已选兴趣:%1\n经验等级:%2").arg(checkText, level));
    }

private:
    QCheckBox *m_cppCheck;
    QCheckBox *m_pythonCheck;
    QCheckBox *m_qtCheck;
    QRadioButton *m_beginnerRadio;
    QRadioButton *m_intermediateRadio;
    QRadioButton *m_expertRadio;
    QLabel *m_statusLabel;
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    OptionWindow window;
    window.setWindowTitle("复选框与单选按钮");
    window.resize(400, 200);
    window.show();
    return app.exec();
}

#include "main.moc"

运行方式

  1. 将上述代码保存为 main.cpp。
  2. 在项目目录下创建 .pro 文件(qmake)或使用CMake。以qmake为例:
# option.pro
QT += widgets
SOURCES = main.cpp
TARGET = option_demo
  1. 执行以下命令编译运行:
qmake option.pro
make
./option_demo

验证方法

程序启动后,窗口显示两组选项。默认状态为:复选框全部未选,单选按钮选中“初级”,底部标签显示“已选兴趣:无 经验等级:初级”。

手动勾选“C++”和“Qt”复选框,再点击“高级”单选按钮,底部标签应实时更新为“已选兴趣:C++、Qt 经验等级:高级”。取消所有复选框后,标签应显示“已选兴趣:无”。每次点击任一选项,标签内容都会立即刷新,且与当前界面勾选状态完全一致,即验证通过。