1.QButtonGroup简介
-
QButtonGroup提供了一个
抽象容器
,可以将按钮小部件
放入其中。它不提供
此容器的可视化表示
,而是管理组中每个按钮的状态
。 -
互斥按钮组
,将关闭除已单击的按钮外的所有可选中(可切换)按钮。默认情况下,按钮组是互斥的
。按钮组中的按钮通常是可检查的,如QPushButtons、QCheckBoxes(通常用于非互斥按钮组)或QRadioButtons。如果创建互斥按钮组,则应确保最初选中该组中的一个按钮
;否则,该组最初将处于未选中按钮的状态。 -
可以使用
addButton()
将按钮添加到组中,然后使用removeButton()
将其删除。如果组是独占的,则当前选中的按钮可用于checkedButton()
。如果单击按钮,则会发出buttonClicked()信号;对于独占组中的可检查按钮,这意味着该按钮已被选中。组中的按钮列表由button()返回。 -
此外,QButtonGroup可以在整数和按钮之间进行映射。您可以使用setId()为按钮分配一个整数id,并使用id()检索它。当前选中的按钮的id可以通过
checkedId()
获得,并且有一个重载的信号buttonClicked(),它会发出按钮的id。id值-1为QButtonGroup保留值,表示“没有这样的按钮”。映射机制的目的是简化用户界面中枚举值的表示。
2. 创建QButtonGroup
- QButtonGroup的构造函数如下:
QButtonGroup(QObject *parent = nullptr);
接收一个对象指针作为其父对象。
3. 成员函数与信号
QButtonGroup常用成员函数有:
函数原型 | 描述 |
---|---|
void setExclusive(bool); | 设置组内按钮是否互斥,不设置默认互斥(true) |
bool exclusive() const; | 获取组内按钮是否互斥的标志,true:互斥,false:不互斥 |
void addButton(QAbstractButton *, int id = -1); | 为按钮组添加按钮,为按钮设置id |
void removeButton(QAbstractButton *); | 从组内删除按钮 |
QList<QAbstractButton*> buttons() const; | 获取组内所有按钮 |
QAbstractButton * checkedButton() const; | 获取按钮组中被选中按钮的指针,如果没有按钮被选中,则返回nullptr |
int checkedId() const; | 获取按钮组中被选中按钮的id,如果没有按钮被选中,则返回-1 |
QAbstractButton *button(int id) const; | 通过按钮id索引按钮对象指针 |
int id(QAbstractButton *button) const; | 通过按钮对象指针索引按钮id |
void setId(QAbstractButton *button, int id); | 为按钮设置id |
QButtonGroup共有8个信号,两两一组共4组:
信号 | 描述 |
---|---|
void buttonClicked(QAbstractButton *); void buttonClicked(int); | 按钮点击信号,按钮组中有按钮被点击发出此信号,并返回被点击的按钮对象指针或id |
void buttonPressed(QAbstractButton *);void buttonPressed(int); | 按钮按下信号,按钮组中有按钮被按下发出此信号,并返回被按下的按钮对象指针或id |
void buttonReleased(QAbstractButton *);void buttonReleased(int); | 按钮释放信号,按钮组中有按钮被释放发出此信号,并返回被释放的按钮对象指针或id |
void buttonToggled(QAbstractButton *, bool);void buttonToggled(int, bool); | 按钮状态改变信号,按钮组中有按钮状态改变发出此信号,并返回状态改变的按钮对象指针/id以及按钮当前状态(点击按钮或程序设置改变按钮状态都会发出此信息号) |
4. 示例
4.1. 为按钮组添加按钮
// 创建按钮组对象
QButtonGroup* btnGroup = new QButtonGroup(this);
// 为按钮组添加三个按钮,并设置id(id可以不设置)
btnGroup->addButton(ui->radioButton, 0);
btnGroup->addButton(ui->radioButton_1, 1);
btnGroup->addButton(ui->radioButton_2, 2);
如果不设置id,函数默认传入的值为-1,此时函数为自动为按钮设置id,自动设置的id为负数且从-2开始。
4.2. 为按钮设置id
btnGroup->setId(ui->radioButton, 0);
由于addButton函数的特性,这里设置id不能为-1(-1视为无效值),且建议使用正值。
4.3. 按钮组中按钮的互斥状态
// 获取按钮组中按钮的互斥状态
btnGroup->exclusive();
// 设置按钮组中按钮的互斥状态
btnGroup->setExclusive(false);
如不设置,获取按钮组中按钮的互斥状态默认为true,即同组中所有按钮互斥。
4.4. 获取组内所有按钮
QList<QAbstractButton*> btnList = btnGroup->buttons();
返回所有按钮的对象列表。
4.5. 获取按钮点击信号,并作相应操作
// 连接信号和槽函数
connect(m_btnGroup, SIGNAL(idClicked(int)), this, SLOT(btnClicked(int)));
// 槽函数
void btnClicked(int btnId)
{
switch (btnId)
{
case 0:
qDebug("This is button zreo");
break;
case 1:
qDebug("This is button one");
break;
case 2:
qDebug("This is button two");
break;
default:
break;
}
}
QT Creator 中操作按钮组方法:
enum HardWareUserRole
{
InValid =-1,
Admin = 0, // 管理员
Engineer = 1, // 工程师
User = 2, // 操作员
};
CUserAddDialog::CUserAddDialog(HardWareUser *pInfo, bool bModify, QWidget *parent)
: m_pInfo(pInfo),
m_bModify(bModify),
CBaseDialog(parent)
{
ui.setupUi(insertedWidget());
setTitle(tr("Add user"));
// 设置窗口固定大小
setFixedSize(600, 700);
connect(ui.m_pBtnSave, SIGNAL(clicked()), this, SLOT(onSave()));
// 设置正则表达式.
ui.m_pLineEditUser->setValidator(new QRegExpValidator(QRegExp("[a-zA-Z0-9]{1,16}")));
ui.m_pLineEditPwd->setValidator(new QRegExpValidator(QRegExp("[a-zA-Z0-9]{1,16}")));
// 限制输入lineEdit中最多只能输入5个字符
ui.m_pLineEditName->setMaxLength(6);
// 按钮为不可点击
ui.m_pRadioBtnAdmin->setEnabled(false);
// 设置按钮组中按钮的id
ui.buttonGroup->setId(ui.m_pRadioBtnOper, User);
ui.buttonGroup->setId(ui.m_pRadioBtnEngineer, Engineer);
ui.buttonGroup->setId(ui.m_pRadioBtnAdmin, Admin);
initial();
}