1. QRadioButton 基本概念
-
用途:用于单选场景,同一分组中仅允许一个按钮被选中。
-
继承关系:继承自 QAbstractButton,支持按钮的通用特性(如点击事件、状态切换)。
-
默认行为:同一父容器下的多个 QRadioButton 自动形成互斥组(排他性)。
2. 创建与分组
创建实例
QRadioButton *radio1 = new QRadioButton("Option 1", parentWidget);
QRadioButton *radio2 = new QRadioButton("Option 2", parentWidget);
手动分组
- 方法 1:使用 QButtonGroup(推荐,灵活控制分组):
QButtonGroup *group = new QButtonGroup(parent);
group->addButton(radio1);
group->addButton(radio2);
- 方法 2:放入同一父容器(如 QGroupBox 或 QWidget)中,利用默认排他性。
3. 信号与槽
常用信号:
-
toggled(bool checked):按钮选中状态变化时触发。
-
clicked():按钮被点击时触发(不关心状态变化)。
示例连接:
connect(radio1, &QRadioButton::toggled, [](bool checked) {
if (checked) qDebug() << "Option 1 selected!";
});
4. 样式定制(QSS)
- 通过 Qt 样式表自定义外观:
radio1->setStyleSheet(
"QRadioButton::indicator { width: 20px; height: 20px; }"
"QRadioButton::indicator:checked { background-color: #FFA500; }"
);
5. 获取选中状态
- 遍历检查:
for (auto btn : group->buttons()) {
if (btn->isChecked()) {
qDebug() << "Selected:" << btn->text();
}
}
- 直接获取(通过 QButtonGroup):
QAbstractButton *selected = group->checkedButton();
if (selected) qDebug() << "Selected:" << selected->text();
6. 常用方法
-
setChecked(true):默认选中。
-
isChecked():检查是否选中。
-
setText() / text():设置或获取显示文本。
-
setEnabled(false):禁用按钮。
7. 注意事项
-
分组管理:跨父容器的按钮需通过 QButtonGroup 分组。
-
默认选中:需手动调用 setChecked(true) 初始化选中状态。
-
内存管理:建议设置父对象,利用 Qt 对象树自动释放内存。
-
排他性:若需关闭自动互斥,使用 setAutoExclusive(false)(罕见需求)。
8. 完整示例
#include <QApplication>
#include <QWidget>
#include <QVBoxLayout>
#include <QRadioButton>
#include <QButtonGroup>
#include <QDebug>
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
QWidget window;
QVBoxLayout *layout = new QVBoxLayout(&window);
QRadioButton *radio1 = new QRadioButton("Option 1");
QRadioButton *radio2 = new QRadioButton("Option 2");
radio2->setChecked(true); // 默认选中
QButtonGroup group;
group.addButton(radio1);
group.addButton(radio2);
layout->addWidget(radio1);
layout->addWidget(radio2);
QObject::connect(radio1, &QRadioButton::toggled, [&](bool checked) {
if (checked) qDebug() << "Option 1 selected!";
});
window.show();
return a.exec();
}