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"
运行方式
- 将上述代码保存为
main.cpp。 - 在项目目录下创建
.pro文件(qmake)或使用CMake。以qmake为例:
# option.pro
QT += widgets
SOURCES = main.cpp
TARGET = option_demo
- 执行以下命令编译运行:
qmake option.pro
make
./option_demo
验证方法
程序启动后,窗口显示两组选项。默认状态为:复选框全部未选,单选按钮选中“初级”,底部标签显示“已选兴趣:无 经验等级:初级”。
手动勾选“C++”和“Qt”复选框,再点击“高级”单选按钮,底部标签应实时更新为“已选兴趣:C++、Qt 经验等级:高级”。取消所有复选框后,标签应显示“已选兴趣:无”。每次点击任一选项,标签内容都会立即刷新,且与当前界面勾选状态完全一致,即验证通过。