QButtonGroup

本文主要根据QT官方帮助文档以及日常使用,简单的介绍一下QButtonGroup的功能以及基本使用

简介

有的时候,我们会创建很多按钮,例如创建3个QPushButton,但是这三个按钮对应的功能比较相似,正常的情况下,我们会绑定三个信号和槽,但是这样就有很多多余的代码,在这种情况下,我们可以使用QButtonGroup来,将按钮加到容器里,统一进行管理。

根据QT帮助文档中的描述,QButtonGroup是一个容纳QAbstractButton的一个容器,这个容器不像QGroupBox一样提供可视化的显示,其主要功能是对按钮的管理。

QButtonGroup默认是互斥的,也就是说,添加到这个容器里面的按钮,默认情况下,只能有一个按钮是checked的;既然是容器,那就有添加和删除,即addButtonremoveButton。同样的,也有获取里面的元素即buttons

关联信号buttonClickedbuttonPressedbuttonToggled,来执行不同按钮按下时,对应的不同操作。

  1. 添加和删除按钮

    添加按钮,使用函数addButton,这个函数的原型是:

    void QButtonGroup::addButton(QAbstractButton *button, int id = -1);

    button 这个参数的代表你要添加的按钮,而后面的 id则是你要添加的按钮的序号,如果id等于-1,根据容器里按钮的id来自动的给按钮添加一个id。自动添加的id,默认会从-2开始。

    QButtonGroup m_group;
    
    m_group_2.addButton(ui->radioButton);
    m_group_2.addButton(ui->radioButton_2);
    m_group_2.addButton(ui->radioButton_3); // 此时按钮的id分别是-2、-3、-4
    QButtonGroup m_group;
    
    m_group_2.addButton(ui->radioButton, 0);
    m_group_2.addButton(ui->radioButton_2, 1);
    m_group_2.addButton(ui->radioButton_3, 2); // 此时按钮的id分别是0、1、2
    QButtonGroup m_group;
    
    m_group_2.addButton(ui->radioButton, 2);
    m_group_2.addButton(ui->radioButton_2);
    m_group_2.addButton(ui->radioButton_3); // 此时按钮的id分别是2、1、0
    QButtonGroup m_group;
    
    m_group_2.addButton(ui->radioButton_2);
    m_group_2.addButton(ui->radioButton_3);
    m_group_2.addButton(ui->radioButton, 2); // 此时按钮的id分别是-2、-3、2

    由上面可以得知:

    如果添加按钮时,设置自动id,如果容器内有按钮,那么新添加的按钮的id为: 容器中已存在的按钮的最小id - 1,如果容器内没有按钮,则默认从-2开始。

    删除按钮,使用函数removeButton,函数的原型是:

        void QButtonGroup::removeButton(QAbstractButton *button)

    button 是你要删除的那个按钮。

  2. 按钮的id

    获取按钮的id,调用id函数,来获取。如果需要重新给按钮设置一个id,调用setId,来给按钮设置一个新的id。两个函数的原型分别为:

        int QButtonGroup::id(QAbstractButton *button) const
    void QButtonGroup::setId(QAbstractButton *button, int id)
  3. 获取当前按下的按钮

    调用checkButton来获取按钮组容器中,选中的按钮,如果没有按钮选中,则返回nullptr。调用checkedId同时也可以获取当前选中的按钮的id。

    int QButtonGroup::checkedId() const
    QAbstractButton *QButtonGroup::checkedButton() const
  4. 设置QButtonGroup互斥

    QButtonGroup默认是互斥的,也就是说,一个按钮组中,在同一时间下,只能有一个按钮被选中。但是,你也可以关闭掉互斥的属性。

    调用setExclusive来设置互斥的属性

信号和槽

信号的连接主要是对里面按钮按下时所发射的信号,主要是两类,一类是返回按下的按钮(QAbstractButton*),另一类是返回按下按钮的id

  1. 返回按下的按钮

    主要是有几个信号:

    void QButtonGroup::buttonClicked(QAbstractButton *button);
    void QButtonGroup::buttonPressed(QAbstractButton *button);
    void QButtonGroup::buttonRelease(QAbstractButton *button)
    void QButtonGroup::buttonToggled(QAbstractButton *button, bool checked);

    由于这些信号都是重载的,所以如果想用函数指针来连接,你像下面这样连接:

    connect(buttonGroup, QOverload<QAbstractButton *>::of(&QButtonGroup::buttonClicked),
    [=](QAbstractButton *button){ /* ... */ });
  2. 返回按下按钮的id

    和上面类似,主要也是几个信号:

    void QButtonGroup::idClicked(int id);
    void QButtonGroup::idPressed(int id);
    void QButtonGroup::idRelease(int id)
    void QButtonGroup::idToggled(int id, bool checked);

[Qt基础-06] QButtonGroup的更多相关文章

  1. 基于C/S架构的3D对战网络游戏C++框架 _04客户端详细设计与OpenGL、Qt基础

    本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...

  2. javaSE基础06

    javaSE基础06 一.匿名对象 没有名字的对象,叫做匿名对象. 1.2匿名对象的使用注意点: 1.我们一般不会用匿名对象给属性赋值的,无法获取属性值(现阶段只能设置和拿到一个属性值.只能调用一次方 ...

  3. javascript基础06

      javascript基础06 splice var del_arr = del.splice(0,2); //删除从指定位置deletePos开始的指定数量deleteCount的元素,数组形式返 ...

  4. Flask基础(06)-->视图常用逻辑

    Flask基础(06)-->视图常用逻辑 返回json 重定向:url_for 自定义状态码 返回json:在使用 Flask 写一个接口时候需要给客户端返回 JSON 数据,在 Flask 中 ...

  5. C/C++ Qt 基础通用组件应用

    QT 是一个跨平台C++图形界面开发库,利用QT可以快速开发跨平台窗体应用程序,在QT中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率. 目前,QT开发中常用的基础 ...

  6. C++ Qt基础知识

    时间如流水,只能流去不流回. 学历代表你的过去,能力代表你的现在,学习能力代表你的将来. 学无止境,精益求精. 记录C++ Qt的基础知识学习记录 <C++ Qt设计模式(第二版)>

  7. qt基础知识之类库概述

    qt是用标准c++编写的跨平台开发类库,它对标准c++进行拓展,引入元对象系统.信号&槽.属性等特征 全局定义 容器类及对应迭代器 qt的模块化体系,分为 基本模块和拓展模块,一个模块通常就是 ...

  8. [Qt基础内容-08] Qt中MVC的M(Model)

    Qt中MVC的M(Model)简单介绍 Qt有自己的MVC框架,分别是model(模型).view(视图).delegate(委托),这篇文章,简单的介绍以下Qt中有关model(模型)的类以及一些基 ...

  9. Qt基础之开发环境部署

    将 Qt 5.6 集成至 VS2015 摘要: 由于VS2015不再支持addin,所以要用其他手段. 这里给出64位系统下的安装步骤,32位类似. 一.安装VS2015 过程略.值得注意的是要选择需 ...

  10. PHP语言基础06 MySql By ACReaper

    上篇介绍了如用PHP连接上MySql进行,并进行sql语句的执行.但是我们没有介绍,如何输出处理的结果,如何获得处理的结果. 这里要先说明Mysql有两种查询处理模式,一种是有缓冲的查询处理模式,一种 ...

随机推荐

  1. undefined method `license' when mac brew install

    https://github.com/Homebrew/discussions/discussions/297 brew update-reset brew config brew doctor

  2. shell(希尔)排序------python实现

    if __name__ == '__main__': ''' 希尔排序 1.选择一个增量序列t1,t2,...,tk,其中ti>tj,tk=1 2.按增量序列个数K,对序列进行K躺排序 3.每趟 ...

  3. Windows7系统启用ipv6的详细步骤(图文)

    IPV6是IETF设计的用于替代现行版本IP协议(IPv4)的下一代IP协议.一般情况下,win7系统默认是关闭IPV6服务的,之前教程也有分享过win7禁用ipv6协议的方法.那么如果要启用ipv6 ...

  4. TNN-linux编译测试记录

    Github: https://github.com/Tencent/TNN docs: https://github.com/Tencent/TNN/blob/master/doc/cn/user/ ...

  5. gRPC编译与字段编号的细节探讨

    上次我们专门通过一个简单的HelloWorld示例来了解了gRPC的基本概念和使用方法.今天,我们将继续深入探讨gRPC,重点讨论一些在实际应用中需要特别注意的要点.实际上,gRPC的核心目标是简化远 ...

  6. JVM实战—13.OOM的生产案例

    大纲 1.每秒仅上百请求的系统为何会OOM(RPC超时时间设置过长导致QPS翻几倍) 2.Jetty服务器的NIO机制如何导致堆外内存溢出(S区太小 + 禁NIO的显式GC) 3.一次微服务架构下的R ...

  7. API 风格选对了,文档写好了,项目就成功了一半!

    在前后端开发中,API文档和API风格设计是提高开发效率.减少沟通成本.确保系统稳定性的关键环节.一个清晰.易用的API文档可以帮助前端开发者快速理解接口的使用方法,而完善的测试则能尽早发现潜在问题, ...

  8. Canvas简历编辑器-选中绘制与拖拽多选交互方案

    Canvas简历编辑器-选中绘制与拖拽多选交互方案 在之前我们聊了聊如何基于Canvas与基本事件组合实现了轻量级DOM,并且在此基础上实现了如何进行管理事件以及多层级渲染的能力设计.那么此时我们就依 ...

  9. 第一二章(Nginx+Lua)开发环境

    第一章 安装OpenResty(Nginx+Lua)开发环境 首先我们选择使用OpenResty,其是由Nginx核心加很多第三方模块组成,其最大的亮点是默认集成了Lua开发环境,使得Nginx可以作 ...

  10. pymysql数据库操作

    1.安装pymsql pip install pymysql 2.导入包 import pymysql 3.连接数据库   conn=pymysql.connect(host='主机地址',user= ...