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. Python__FLASK__MySQL基础

    1.数据库的基本操作 创建数据库:使用"CREATE DATABASE 数据库名:"语句创建新的数据库 查看数据库:使用"SHOW DATABASES:"语句查 ...

  2. CentOS安装tigerVNC Server

  3. 21. C++快速入门--协程 Coroutine 入门

    参考: https://www.cnblogs.com/blizzard8204/p/17563217.html https://www.bennyhuo.com/2022/03/09/cpp-cor ...

  4. (八).NET6.0添加通用的Redis功能

    1.添加包:StackExchange.Redis 2.在配置文件里面,新建Redis的有关配置信息 Name是别名,可以任意起.Ip是Redis的服务端地址,例如安装本地,就是127.0.0.1,端 ...

  5. 【Java RPC】使用netty手写一个RPC框架 结合新特性 虚拟线程

    [手写RPC框架]如何使用netty手写一个RPC框架 结合新特性 虚拟线程 什么是RPC框架 RPC(Remote Procedure Call)远程过程调用,是一种通过网络从远程计算机程序上请求服 ...

  6. Spring Boot进阶教程--注解大全

    springboot注解大全 SpringBoot注解就是给代码打上标签的能力.通过引入注解,我们可以简单快速赋予代码生命力,大大提高代码可读性和扩展性.注解本身不具有任何能力,只是一个标签,但是我们 ...

  7. w3cschool-Lua编程入门

    https://www.w3cschool.cn/nhycto/ https://www.w3cschool.cn/cf_web/cf_web-dvxc32qu.html 1. Lua 基础知识 (1 ...

  8. w3cschool-Go 教程

    https://www.w3cschool.cn/go/ Go 是一个开源的编程语言,它能让构造简单.可靠且高效的软件变得容易. Go是从2007年末由Robert Griesemer, Rob Pi ...

  9. 一个奇葩的SQL题,够强大。

    困惑描述: 现有一张图片表,表里一个sort字段,这个字段是不重复的.不连续的数字.大致结构如下 create table Imgs( `id` bigint(20) NOT NULL AUTO_IN ...

  10. 2025高级java面试精华及复习方向总结

    1. Java基础 顶顶顶顶的点点滴滴 1.1 java集合关系结构图 1.2 如何保证ArrayList的线程安全 方法一: 使用 Collections 工具类中的 synchronizedLis ...