QButtonGroup

1.用法介绍

QButtonGroup是一个很有用的容器,可以把若干按键(哪种都行)放到一个容器中,有以下几点好处:

  1. 逻辑分组QButtonGroup允许你将相关联的按钮逻辑上分组在一起。这对于处理一组RatioButtonQCheckBox很有用,可以将他们设置成互斥之类的
  2. 方便管理:通过将按钮添加到QButtonGroup中,你可以方便地对这些按钮进行统一管理。例如,你可以轻松地获取选中的按钮、设置默认选中按钮、禁用/启用整个按钮组等操作
  3. 信号传递QButtonGroup提供了信号来通知按钮的状态变化,例如当选中的按钮发生变化时,QButtonGroup会发出buttonClicked()信号,在槽函数中,可以获得到底是哪个按键被按下了,这样的话,若干个按键就写一个槽函数就行了,不必每个按键都写个槽函数。
1
2
3
4
5
void CChartTest::on_otherGroup_buttonClicked(QAbstractButton *button)
{
// 拿到发送信号的复选按钮
QCheckBox *btn = dynamic_cast<QCheckBox *>(button);
}

但是有个关键问题,就是获取到了被按下的按键这个对象后,如果判断他是哪个按键呢?

1.比较简单的方法是直接根据按键中的文本来判断,但是这样的话如果改了UI中的文本的话,要修改的地方比较多。

2.更好的方式:利用Qt元对象系统中的属性机制。为每个按键设置一个自定义属性,在槽函数中由btn这个对象的属性的取值,来定位到底是哪个按键

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 通过按钮动态属性判断按钮操作
switch(btn->property("btnType").toInt())
{
case 0:
{
// 设置view的防锯齿,其还包含其他防锯齿选项,可查看帮助了解
m_chartView->setRenderHint(QPainter::Antialiasing, checked);
break;
}
case 1:
{
foreach(QChart *chart, m_chartVector)
{
// 通过三目运算符判断标题是否获取data中的值
QString title = checked ? chart->data(Qt::UserRole).toString() : "";
// 设置标题
chart->setTitle(title);
}
break;
}
default:
break;
}

如果按键的槽函数就是为了设置控件的某个属性,可以直接为各个按键添加一个属性,然后属性的值就设置为控件要设置成的属性:

1
2
3
4
5
6
7
8
9
10
11
12
13
void CChartTest::on_buttonGroup_buttonClicked(QAbstractButton *button)
{
// 拿到发送信号的单选按钮
QRadioButton *btn = dynamic_cast<QRadioButton *>(button);
// 遍历图表容器,将legend的aign属性设为当前按钮对应的属性状态
foreach(QChart *chart, m_chartVector)
{
//! 拿到当前单选按钮的属性值并强转为Qt::Alignment类型
Qt::Alignment align = static_cast<Qt::Alignment>(btn->property("LegendValue").toUInt());
// 将类型值设置到当前图表上
chart->legend()->setAlignment(align);
}
}

2.创建方式

2.1使用代码创建

1
2
3
4
5
6
7
8
9
10
11
QButtonGroup *buttonGroup = new QButtonGroup(this);

QPushButton *pushButton = new QPushButton("Push Button", this);
buttonGroup->addButton(pushButton);

QRadioButton *radioButton = new QRadioButton("Radio Button", this);
buttonGroup->addButton(radioButton);

QCheckBox *checkBox = new QCheckBox("Check Box", this);
buttonGroup->addButton(checkBox);

2.2使用Qt Designer创建

image-20240330172303805 image-20240330172318317