Qt之QButtonGroup简单使用

时间:2021-10-21 19:42:01

在项目中遇到一个需求,根据外部条件来确定你的界面上显示多少个按钮。于是,写一个小程序测试了下,效果还可以。
主要用到QButtonGroup类,需要包含头文件,接着申请一个按钮数组对象QButtonGroup *buttonGroup,所有的按钮在ui中定义好了。
下面贴代码:
.h文件:

#include <QWidget>
#include <QButtonGroup>
#include <QDebug>

namespace Ui {
class SwitchButtonWidget;
}

class SwitchButtonWidget : public QWidget
{
Q_OBJECT

public:
explicit SwitchButtonWidget(int number,QWidget *parent = 0);
//number即为已知的外部条件
~SwitchButtonWidget();

private:
Ui::SwitchButtonWidget *ui;
QButtonGroup *buttonGroup;
int m_number;
void initButton();
public slots:
void buttonJudge(int buttonId);
};

.cpp文件:

SwitchButtonWidget::SwitchButtonWidget(int number, QWidget *parent) :
QWidget(parent),
ui(new Ui::SwitchButtonWidget)
{
ui->setupUi(this);
m_number = number;
setStyleSheet("background-color:white;"
"QPushButton{"
"background-color:white;"
"color:black;"
"text-align:center;"
"border-radius: 8px;"
"border: 2px groove gray;"
"border-style: outset;"
"}");
buttonGroup = new QButtonGroup;
//第二个参数id可以自行定义
buttonGroup->addButton(ui->pushButton_1,1);
buttonGroup->addButton(ui->pushButton_2,2);
buttonGroup->addButton(ui->pushButton_3,3);
buttonGroup->addButton(ui->pushButton_4,4);
buttonGroup->addButton(ui->pushButton_5,5);
buttonGroup->addButton(ui->pushButton_6,6);
buttonGroup->addButton(ui->pushButton_7,7);
buttonGroup->addButton(ui->pushButton_8,8);
buttonGroup->addButton(ui->pushButton_9,9);
initButton();
connect(buttonGroup,SIGNAL(buttonClicked(int)),this,SLOT(buttonJudge(int)));

}

SwitchButtonWidget::~SwitchButtonWidget()
{
delete ui;
}

void SwitchButtonWidget::initButton()
{
QPushButton *button;
bool isFlag = false;
QString bname;
if(m_number > 9)
return;
qDebug() << "m_number" << m_number;
for(int i = 1; i <= m_number;i++)//pushButton_1
{
bname = "pushButton_" + QString::number(i);
button = this->findChild<QPushButton *>("pushButton_" + QString::number(i));
//注意这样是this调用findChild方法,一开始使用这个是我是buttonGroup直接去调用的,这个得到的是空的无效的按钮
isFlag = true;
if(isFlag)
{
button->show();
isFlag = false;
}
}
for(int i = m_number + 1; i <= 9;i++)
{
button = this->findChild<QPushButton *>("pushButton_" + QString::number(i));
isFlag = false;
if(!isFlag)
{
button->hide();
isFlag = false;
}
}
}

void SwitchButtonWidget::buttonJudge(int buttonId)
{
qDebug() << "the Key:" << buttonId;
}

主要用到findChild()方法,通过按钮的名字去查找相应的按钮,返回找到的按钮,还有一个findChildern()方法返回的是按钮的QList<>数组。
最初的想法是根据id值来索引相应的按钮,发现没有对应的接口,如果可以这样就方便多了。
/************************************分割线*************************************/
它的成员函数buttons()的使用:

//btnGroup为按钮组对象
QList<QAbstractButton*> buttonsList = btnGroup->buttons();
if(buttonsList.isEmpty()){
qDebug() << "isEmpty";
return;
}
foreach (QAbstractButton *button, buttonsList)
{
((QPushButton*)button)->setEnabled(false);
//设置按钮不可点击
}

在上面的例子中,通过buttons()函数获取btnGroup的每一个按钮对象,然后设置为不可点击。QAbstractButton 类是 QPushButton,QCheckBox,QRadioButton 等类的基类,它可以代表按钮、单选纽、复选纽等重要窗口部件。所以强转成QPushButton类。end…