QRadioButton是Qt框架中用于创建单选按钮的类,它提供了一组互斥的选项,用户只能从中选择一个。
它用在 “多选一” 的场景,比如性别中的 “男女” 二选一,学历中的 “博士/硕士/本科/其他” 四选一
1. 效果演示
- 如何将单选按钮分组
- 如何获取分组中选中的按钮
- 信号槽演示

2. 属性和方法
QRadioButton有很多属性,完整的可查看帮助文档。这里列出常用的属性和方法
2.1 文本
这两个是其父类 QAbstractButton 中的属性和方法,因此 QPushButton、QRadioButton、QCheckBox 都具有该属性
// 获取和设置显示的文本
QString text() const
void setText(const QString &text)
2.2 选中状态
// 获取和设置单选按钮的选中状态
bool isChecked() const
void setChecked(bool)
选中一个按钮,有3种方式:
- 用户点击
- 代码中radio->click()
- 代码中radio->setChecked(bool)
2.3 自动排他
我们前面说过,单选按钮实现的是 “多选一”,因此单选按钮的该属性默认是使能的
// 获取和设置自动排他
bool autoExclusive() const
void setAutoExclusive(bool)
而对于多选按钮,也叫复选按钮QCheckBox,通常的场景是 “多选多”,因此该属性默认是禁能的。
综合以上,“多选一” 要满足以下两个条件:
- 将要互斥选择的单选按钮,放在一个分组中
- 将单选按钮的
autoExclusive属性设置为true,该属性默认就是使能的。可在右侧的属性按钮中看到,如下:
2.4 信号槽
单选按钮在按下和抬起的过程中,会发射多个信号。
// 单选按钮 QRadioButton 被点击时,会发出该信号
void clicked();
// 当单选按钮的选中状态发生改变时,会发射该信号
// 所谓状态改变,是指选中变为非选中,和非选中变为选中
void toggled(bool checked)
3. 从零实现
从零写代码实现整体效果,以演示复选框的属性以及信号槽的用法
3.1 布局
在UI设计师界面,拖拽对应的控件,修改显示的文字、控件的名称,然后完成布局
- 合理地使用了水平、垂直、栅格布局
- 合理地使用弹簧
- 合理地调整Layout的各种参数,来设置外边距、内边距
- 合理地调整字体大小
即可完成以下效果,多操作自然就熟练了(完成后的代码,会一并共享给大家的~)
3.2 代码实现
3.2.1 错误的分组
第1个分组中,默认选中 “女博士”,如下:
MyWidget::MyWidget(QWidget* parent) : QWidget(parent), ui(new Ui::MyWidget) {
ui->setupUi(this);
setWindowTitle("明王讲QT | 第二章 常用控件 | 2.5 单选按钮QRadioButton");
// 1. 分组1
ui->radioFemale1->setChecked(true);
ui->radioDoctor1->setChecked(true);
}
此时,由于这6个单选按钮在frame1同一个分组中,因此只选中了 “博士”,如下:
3.2.2 正确分组:QWidget
第2个分组中,默认选中 “女博士”,如下:
MyWidget::MyWidget(QWidget* parent) : QWidget(parent), ui(new Ui::MyWidget) {
// 2. 分组2
ui->radioFemale2->setChecked(true);
ui->radioDoctor2->setChecked(true);
}
此时,这6个单选按钮分别属于widget12和widget22这两个分组/容器中,因此,可以正常选中,如下:
3.2.3 正确分组:QGroupBox
首先,在第3个分组中,默认选中 “女博士”,如下:
MyWidget::MyWidget(QWidget* parent) : QWidget(parent), ui(new Ui::MyWidget) {
// 3. 分组3
ui->radioFemale3->setChecked(true);
ui->radioDoctor3->setChecked(true);
}
此时,这6个单选按钮分别属于groupGender3和groupEdu3这两个分组/容器中,因此,可以正常选中,如下:
然后,实现点击按钮打印用户的选择,如下:
// mywidget.h
class MyWidget : public QWidget {
private slots:
void on_btnPrint_clicked();
};
// mywidget.cpp
void MyWidget::on_btnPrint_clicked() {
QString s;
if ( ui->radioMale3->isChecked() ) {
s += ui->radioMale3->text();
} else if ( ui->radioFemale3->isChecked() ) {
s += ui->radioFemale3->text();
}
if ( ui->radioDoctor3->isChecked() ) {
s += ui->radioDoctor3->text();
} else if ( ui->radioMaster3->isChecked() ) {
s += ui->radioMaster3->text();
} else if ( ui->radioBachelor3->isChecked() ) {
s += ui->radioBachelor3->text();
} else if ( ui->radioOthers3->isChecked() ) {
s += ui->radioOthers3->text();
}
ui->lineEditResult3->setText(s);
}
3.2.4 正确分组:QButtonGroup
使用QButtonGroup对单选按钮进行分组
首先,在mywidget.h中声明槽函数以及两个QButtonGroup成员,如下:
#include <QButtonGroup>
class MyWidget : public QWidget {
private slots:
void onRadioButton4Clicked();
void on_radioMale4_toggled(bool checked);
private:
QButtonGroup* btnGroupGender;
QButtonGroup* btnGroupEdu;
};
然后,在mywidget.cpp中创建按钮分组并关联信号槽,如下:
MyWidget::MyWidget(QWidget* parent) : QWidget(parent), ui(new Ui::MyWidget) {
// 4. 分组4
btnGroupGender = new QButtonGroup(this);
btnGroupGender->addButton(ui->radioMale4, 0);
btnGroupGender->addButton(ui->radioFemale4, 1);
btnGroupEdu = new QButtonGroup(this);
btnGroupEdu->addButton(ui->radioDoctor4, 10);
btnGroupEdu->addButton(ui->radioMaster4, 11);
btnGroupEdu->addButton(ui->radioBachelor4, 12);
btnGroupEdu->addButton(ui->radioOthers4, 13);
connect(ui->radioMale4, &QRadioButton::clicked, this, &MyWidget::onRadioButton4Clicked);
connect(ui->radioFemale4, &QRadioButton::clicked, this, &MyWidget::onRadioButton4Clicked);
connect(ui->radioDoctor4, &QRadioButton::clicked, this, &MyWidget::onRadioButton4Clicked);
connect(ui->radioMaster4, &QRadioButton::clicked, this, &MyWidget::onRadioButton4Clicked);
connect(ui->radioBachelor4, &QRadioButton::clicked, this, &MyWidget::onRadioButton4Clicked);
connect(ui->radioOthers4, &QRadioButton::clicked, this, &MyWidget::onRadioButton4Clicked);
// 设置第4组中的默认显示
ui->radioMale4->click();
ui->radioBachelor4->click();
}
此时,这6个单选按钮分别属于btnGroupGender和btnGroupEdu这两个分组/容器中,因此,可以正常选中,如下:
最后,实现这两个槽函数,如下:
#include <QDebug>
void MyWidget::onRadioButton4Clicked() {
QString s;
int checkedGenderId = btnGroupGender->checkedId();
if ( checkedGenderId == 0 ) {
s += "男";
} else if ( checkedGenderId == 1 ) {
s += "女";
}
int checkedEduId = btnGroupEdu->checkedId();
if ( checkedEduId == 10 ) {
s += "博士";
} else if ( checkedEduId == 11 ) {
s += "硕士";
} else if ( checkedEduId == 12 ) {
s += "本科";
} else if ( checkedEduId == 13 ) {
s += "其他";
}
ui->lineEditResult4->setText(s);
}
void MyWidget::on_radioMale4_toggled(bool checked) {
qDebug() << "radioMale4 state changed: " << checked;
}
4. 点赞、获取源码
看到这里的小伙伴,去B站给明王一个【免费的点赞】吧,你的支持,是我持续更新优质内容的动力,感谢~
源码下载地址
链接: https://pan.baidu.com/s/1N9MD8_n8xpEe7Co8JNnARw
提取码: ming







