[Qt 教程之Widgets模块] —— QButtonGroup抽象容器

Qt系列教程总目录

0. QButtonGroup简介

QButtonGroup提供了一个抽象容器,可以将按钮小部件放入其中。它不提供此容器的可视化表示,而是管理组中每个按钮的状态。

互斥按钮组,将关闭除已单击的按钮外的所有可选中(可切换)按钮。默认情况下,按钮组是互斥的。按钮组中的按钮通常是可检查的,如QPushButtonsQCheckBoxes(通常用于非互斥按钮组)或QRadioButtons。如果创建互斥按钮组,则应确保最初选中该组中的一个按钮;否则,该组最初将处于未选中按钮的状态。

可以使用addButton()将按钮添加到组中,然后使用removeButton()将其删除。如果组是独占的,则当前选中的按钮可用于checkedButton()。如果单击按钮,则会发出buttonClicked()信号;对于独占组中的可检查按钮,这意味着该按钮已被选中。组中的按钮列表由button()返回。

此外,QButtonGroup可以在整数和按钮之间进行映射。您可以使用setId()为按钮分配一个整数id,并使用id()检索它。当前选中的按钮的id可以通过checkedId()获得,并且有一个重载的信号buttonClicked(),它会发出按钮的idid-1QButtonGroup保留值,表示“没有这样的按钮”。映射机制的目的是简化用户界面中枚举值的表示。

1. 创建QButtonGroup

QButtonGroup的构造函数如下:

QButtonGroup(QObject *parent = nullptr);

接收一个对象指针作为其父对象。

2. 成员函数与信号

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以及按钮当前状态(点击按钮或程序设置改变按钮状态都会发出此信息号)

其中,返回按键id的信号,在Qt5.15之后,就使用以下信号替代了,Qt5.15是过渡版本,之后版本和之前不兼容:

void buttonClicked(int);   -->   void idClicked(int);
void buttonPressed(int);   -->   void idPressed(int);
void buttonReleased(int);  -->   void idReleased(int);
void buttonToggled(int, bool);  -->  void idToggled(int, bool);

3. 示例

3.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开始。

3.2. 为按钮设置id

btnGroup->setId(ui->radioButton, 0);

由于addButton函数的特性,这里设置id不能为-1(-1视为无效值),且建议使用正值。

3.3. 按钮组中按钮的互斥状态

// 获取按钮组中按钮的互斥状态
btnGroup->exclusive();

// 设置按钮组中按钮的互斥状态
btnGroup->setExclusive(false);

如不设置,获取按钮组中按钮的互斥状态默认为true,即同组中所有按钮互斥。

3.4. 获取组内所有按钮

QList<QAbstractButton*> btnList = btnGroup->buttons();

返回所有按钮的对象列表。

3.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;
    }
}
  • 5
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
用c++/qt写的项目,可供自己学习,项目都经测试过,真实可靠,请放心使用。Qt支持 Windows、Linux/Unix、Mac OS X、Android、BlackBerry、QNX等多种平台,并为这些不同的平台提供了统一的开发环境。 面向对象 C++是完全面向对象的,这一点和Objective-c等在开发很相似。而Qt又是基于C++一种语言的扩展,大家都知道C++ 有快速、简易、面向对象等很多优点,所以Qt自然也继承者C++这些的优点。 Qt良好的封装机制使得Qt模块化程度非常高,可重用性较好,对用户开发来货是非常方便的。Qt提供一种为signals/slots(信号和槽) 的安全类型来替代callback,使得各个元件之间的协同工作变得十分简单。 丰富的API Qt包括多达 250 个以上的 C++ 类,还提供基于模板的 collections, serialization, file, I/Odevice, directory management, date/time 类。甚至还包括正则表达式的处理功能。 支持 2D/3D 图形渲染,支持 OpenGL。 大量的开发文档。 XML支持 Webkit 引擎的集成,可以实现本地界面与Web内容的无缝集成, 但是真正使得 Qt 在自由软件界的众多 Widgets (如 Lesstif,Gtk,EZWGL,Xforms,fltk 等等)中脱颖而出的还是基于 Qt 的重量级软件 KDE。 信号和槽机制 Qt提供了信号和槽机制用于完成见面操作的响应,是完成任意两个Qt对象之通信机制。其中,信号会在某个特定情况或动作下被触动,槽是等同于接受并处理信号的函数。 为什么方法不是直接调用的。中间用到 Signal 和槽机制不是多此一举? 其实在我们生活也是一样,老板级别的好说话,老板给助理分派任务也好说话,但是助理给老板分任务,可想而知会有什么后果,在以前的统治阶层肯定不允许这样的事发生。所以在分层思想中,我们所调用的函数也是这样的,上层可以调用下层和同一层的函数,下层函数不可以调用上层函数,否则程序的层次性会被打破,导致结构错综复杂,难以维护和管理。 那么怎样才能做到向上管理呢,有任务分配给老板怎么办? 老板会设立一个机构,也就是一个函数,用无限循环来查询助理的状态,如果助理真的有事情,这个机构就把这消息拿到老板来处理。但是这种处理方式显得有些复杂,我们想要的简单明了的方式是,如果助理有事件发生,可以直接调用老板函数处理。 说了这么多其实就是想说,信号和槽的最大优势在于,它完善了程序分层的思想,可以在不改变程序的层次性的情况下,完成由下层到上层的调用。在下层发出一个 Signal,这时上层与其想关联的 Slot 函数就会响应。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万俟淋曦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值