今天我们介绍下QButtonGroup的用法,按照字面意思理解就是按钮组,QButtonGroup能够用到很多地方,比如和QStackedWidget合起来使用能够达到实现tab,也可以单独使用形成多个按钮单选的需求。
构造:
QButtonGroup::QButtonGroup ( QObject * parent = 0 );
他的public方法也比较简单:
void addButton ( QAbstractButton * button )
void addButton ( QAbstractButton * button, int id )
上面这两个方法均能够将按钮添加到按钮组中,区别是第一种的方法没有指定按钮的id,如果QButtonGroup不指定按钮的id,他默认是从-2开始,在实际需求中,我们经常会遇到从0开始,那么第二种方法就能够很好的解决这个问题,因为它可以指定按钮的id,对一些我们需要精确确定点击的按钮属于按钮组中的哪个,能够提供很好的帮助。
其他的方法都比较简单:
QAbstractButton * button ( int id ) const
QList buttons () const
这两个方法和前面的恰好相反,功能是获取按钮组中指定id的按钮或者全部按钮的列表
QAbstractButton * checkedButton () const
这个方法是获取目前按钮组选中的按钮
void setExclusive ( bool )
设定按钮组互斥,也就是说如果设置为true之后,按钮组中的按钮每次都只能够有一个被选中
下面的几个方法按照字面解释基本能够确定用法,就不多解释
int checkedId () const
bool exclusive () const
int id ( QAbstractButton * button ) const
void removeButton ( QAbstractButton * button )
void setId ( QAbstractButton * button, int id )
信号也有几种:
void buttonClicked ( QAbstractButton * button )
void buttonClicked ( int id )
void buttonPressed ( QAbstractButton * button )
void buttonPressed ( int id )
void buttonReleased ( QAbstractButton * button )
void buttonReleased ( int id )
基本上我们就能够用到上面的两个信号,当然具体其他的信号,还是要根据自己的需要来确定
下面我们看下主要用法:
包含头文件:
#include
QButtonGroup* pButtonGroup = new QButtonGroup();
pButtonGroup->setExclusive(true); //设置这个按钮组为互斥模式
pButtonGroup->addButton(ui->btnHole, 0);
pButtonGroup->addButton(ui->btnRidge, 1);
pButtonGroup->addButton(ui->btnSurface, 2);
pButtonGroup->addButton(ui->btnOther, 3);
//上面介绍的是有已经在Qt designer里面拖曳按钮在界面上的情况,如果使用代码布局也是可以的
QPushButton* btnHole = new QPushButton("Hole");
pButtonGroup->addButton(btnHole);
pButtonGroup->setId(btnHole, 0);
//...
//以此类推,new出后面的几个按钮
//很重要的一点,如果需要这些按钮有不同的状态,需要将这些按钮设置属性checkble为true,要不然通过checkedId()方法获取不到选中的按钮Id,
这些也是要通过自己的需求确定,自己选择。
connect(pButtonGroup, SIGNAL(buttonClicked(int)), this, SLOT(slot_btnGroupClicked(int)));
//当然也可以指定选中的按钮
int nSelectBtn = 1;
QPushButton *btn = qobject_cast (buttonGroup->button(nSelectBtn));
btn->setChecked(true);
槽函数的实现:
void Class T:: slot_btnGroupClicked(int nId)
{
//do somethings...
}
如果我们需要使用QButtonGroup和QStackedWidget来实现类似tab的功能,那么:
QStackedWidget *m_pStackedWidget;
m_pStackedWidget = new QStackedWidget(this);
for(int nIndex = 0; nIndex < 4; nIndex++)
{
QWidget* pWidget = new QWidget();
pWidget->setObjectName(QString("..."));
m_pStackedWidget->addWidget(pWidget);
/**这儿也可以用insertWidget来代替addWidget,能够指定pWidget的id,如果使用addWidget方法,则需要和QButtonGroup的按钮的添加顺序一一对应,要不然就会出现页面错乱的现象**/
//m_pStackedWidget->insertWidget(nIndex, pWidget);
}
槽函数实现:
void Class T:: slot_btnGroupClicked(int nId)
{
m_pStackedWidget->setCurrentIndex(nId);
}
以上是QButtonGroup的部分用法,能够实现的功能还是比较多的,需要在需求中合理的选择。