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

2023-11-03

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;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[Qt 教程之Widgets模块] —— QButtonGroup抽象容器 的相关文章

  • QTableView 中的虚拟列?

    我开始学习 Qt4 模型 视图编程 我有初学者问题 我有一个简单的应用程序 其中显示 sqlite 表QTableView class Model QtSql QSqlTableModel def init self parent None
  • QGraphicsView 和 eventFilter

    这个问题已经困扰我两天多了 所以我想我应该问一下 我在Win7上使用Qt 4 5 3 用VC2008编译 我有 MyGraphicsView 继承 QGraphicsView 和 MyFilter 继承 QObject 类 当我将 MyFi
  • 有没有办法在没有 QApplication::exec() 的情况下使用 Qt?

    有没有一种安全的方法可以在不调用 QApplication exec 的情况下使用 Qt 我有许多不同的对象正在对多个资源执行长期进程 至少其中一个正在与 Web 应用程序服务器进行通信 我正在制作一个 GUI 应用程序 提示用户在正确的时
  • Qt Creator:如何区分 win32 和 win64

    我必须在 pro 文件中执行类似的操作 win32 LIBS L 3rdparty libusb win32 lib msvc llibusb else win64 LIBS L 3rdparty libusb win32 lib msvc
  • Qt - 如何粘合两个窗口并将它们移动在一起?

    就像qmmp Qt 音乐播放器ui设计一样 这两个或三个窗口实际上在同一个窗口中 因为只有一个dock图标 并且这些窗口可以一起移动并相互附着 我看了源码 好像有用QDockWidget 但我真的不知道如何获得它的细节 当您手动移动辅助窗口
  • 如何在模型更改时停止ListView“跳跃”

    我需要做什么 我需要创建一个聊天窗口用一个ListView在 QML 中存储聊天消息 我设置listView positionViewAtEnd 以便跟踪最后的消息 我禁用positionViewAtEnd当我向上滚动时 我可以阅读过去的消
  • PyQt:如何设置组合框项目可检查?

    为了将 GUI 小部件数量保持在最低限度 我需要找到一种方法来为用户提供下拉菜单项的选择 这些菜单项可用于过滤掉 listWidget 项中显示的内容 假设 listWidget 列出了 5 个不同类别的项目 Cat A Cat B Cat
  • 如何在带有预编译头的项目中使用google protobuf

    我有一个包含多个项目的解决方案 我的项目 但不是全部 使用预编译头 我决定使用 protobuf 但遇到了一个问题 在 protoc exe 从 proto 生成 pb h 后 我尝试包含标头并收到错误 预编译标头未包含在 pb h 中 我
  • 从布局中按名称获取小部件

    如果我想从 python Qt 的布局中获取特定的小部件 我应该如何进行 到目前为止我所做的 for i in range self ui horizontalLayout 14 count here it does fail name s
  • 向 Qt 样式表添加特异性时丢失样式

    这是我的代码 const QString STYLE SHEET background color rgba x x x y border 1px solid gray border radius 0px border top 1px so
  • 如何创建用于 QML 的通用对象模型?

    我想知道是否有任何宏或方法如何将 Qt 模型注册为 QObject 的属性 例如 我有AnimalModel http doc qt io qt 5 qtquick modelviewsdata cppmodels html qabstra
  • 如何获取 QTableView 的标题列表?

    我有一个QTableView我的对话框中的对象 我需要访问该表的水平标题并将它们放入QStringList object 尽管进行了大量搜索 但我在 Qt 文档中找不到如何获取此标头列表 编辑 我发现的最接近的地方是this https w
  • QFileDialog::getSaveFileName 和默认的 selectedFilter

    我有 getSaveFileName 和一些过滤器 我希望当用户打开 保存 对话框时选择其中之一 Qt 文档说明如下 可以通过将 selectedFilter 设置为所需的值来选择默认过滤器 我尝试以下变体 QString selFilte
  • Qt:如何连接到 SQLite?

    我安装了 SQLite3 解压到 c sqlite 创建了一个数据库 c sqlite mzsales 现在我试图在 QTableView 中显示其内容 QSqlDatabase db QSqlDatabase addDatabase QS
  • Qt 是否已经有了自己的 new 和 delete 运算符?

    我正在使用一个QGraphicsScene小部件并在其上显示一些点QGraphicsRectItem 这意味着要拨打很多电话new addItem 当出现时 并且removeItem delete摆脱未使用的点 当然 对于性能问题 我已经实
  • QSerialPort 中的 readAll() 不包括最后发送的响应

    我正在使用 Qt 来控制串行设备 如果我向串行设备发送命令 我会执行类似的操作serial gt write command r n 我制作了一个按钮 它将纯文本小部件内的文本更改为串行端口的响应 为了获得串口的响应 我使用serial g
  • Qt moc 在头文件中实现?

    是否可以告诉 Qt MOC 我想声明该类并在单个文件中实现它 而不是将它们拆分为 h 和 cpp 文件 如果要在 cpp 文件中声明并实现 QObject 子类 则必须手动包含 moc 文件 例如 文件main cpp struct Sub
  • 如何将 zlib 添加到现有的 qt 安装中

    如何将 zlib 添加到 Qt 的现有安装中 我对此很陌生 所以请给我详细的描述 提前感谢您的帮助 zlib 包含在 Qt 核心库中 如果你想在 Qt 程序中使用 zlib 函数 你只需要包含 src 3rdparty zlib 中的 zl
  • 静态变量中的 qt tr()

    我在 qt 中的翻译方面遇到问题 我的项目中的所有翻译都工作正常 但有一个翻译位于类的静态变量中 相应部分代码如下 头文件类似于这样 typedef struct int type QString problematicString inf
  • 安装J语言的JQt IDE,出现错误

    我一直按照这里的说明进行操作 http code jsoftware com wiki System Installation Linux http code jsoftware com wiki System Installation L

随机推荐

  • Node.js+express连接mysql数据库

    首先nodejs pxpress连接mysql 数据库我们要用的工具有 前提得搭建号nodejs环境 https nodejs org en node官网 进入官网后不要直接下载推荐版本 推荐的node版本太高的有的东西是不兼容的 推荐大家
  • 200个经典C语言程序

    1 绘制余弦曲线 在屏幕上用 显示0 360度的余弦函数cos x 曲线 问题分析与算法设计 如果在程序中使用数组 这个问题十分简单 但若规定不能使用数组 问题就变得不容易了 关键在于余弦曲线在0 360度的区间内 一行中要显示两个点 而对
  • ubuntu安装flex和bison时显示没有可安装候选的解决方案

    任务 在ubuntu虚拟机中下载安装flex和bison 工具版本 Virtual Box6 1 Ubuntu16 BUG描述 输入命令 sudo apt get install flex bison 报错 解决方案 flex和bison属
  • Set构造函数及其属性

    Set构造函数及其属性 Set的属性 Set prototype Set prototype add 方法 Set prototype clear 方法 Set prototype has 方法 Set prototype delete 方
  • UART串口的8倍过采样和16倍过采样原理

    由于在空闲状态时 传送线为逻辑 1 状态 而数据的传送总是以一个起始位 0 开始 所以当接收器检测到一个从 1 向 0 的跳变时 便视为可能的起始位 要排除干扰引起的跳变 起始位被确认后 就知道发送器已开始发送 接收器就可以按这个数据通信格
  • 利用SSM搭建web项目

    下面给大家介绍一下 ssm的搭建和使用 7步搞定框架搭建 SSM所需要的jar包下载地址 http download csdn net download baidu 32492845 10126554 1 创建数据库 DROP TABLE
  • 性能测试怎么做?性能测试策略配套适用场景,打通性能测试...

    目录 导读 前言 一 Python编程入门到精通 二 接口自动化项目实战 三 Web自动化项目实战 四 App自动化项目实战 五 一线大厂简历 六 测试开发DevOps体系 七 常用自动化测试工具 八 JMeter性能测试 九 总结 尾部小
  • 网易2018校园招聘编程题真题集合

    1 8 编程题 魔法币 include
  • linux fedora 桌面环境,为Fedora 30系统安装Deepin桌面环境(DDE)

    Fedora 30已经新增两个桌面环境选项 DeepinDE 和 Pantheon Desktop 所以除GNOME KDE Plasma 和 Xfce 之外 因为Deepin桌面环境现在可以在Fedora 30存储库中使用 用户现在还可以
  • ChatGPT应用场景: 基于对话生成的智能客服系统

    关于ChatGPT 今天小编简单说下用在客服服务的要点 ChatGPT可以用于开发基于对话生成的智能客服系统 帮助企业提供高效 便捷 满意的在线客服服务 从而提升客户体验和满意度 以下是ChatGPT应用于智能客服系统的一些场景 1 自动回
  • 基于redis分布式缓存实现

    在网上找了些redis搭建集群的资料 分享给大家 可以仔细看看 了解redis主从复制的逻辑 以及如何构建redis集群 Redis复制流程概述 Redis的复制功能是完全建立在之前我们讨论过的基于内存快照的持久化策略基础上的 也就是说无论
  • flask.ext 的那些事

    偶然发现 在pycharm 使用alter enter 自动修复 未导入的外部模块时 推荐的是 flask ext 包名 的形式 如下例 from flask ext migrate import Migrate MigrateComman
  • 分立元件搭建自举电路解析-高端mos驱动

    分立元件搭建自举电路 上桥mos驱动 高端MOS为什么要自举电路 自举电容 分立元件搭建自举电路 高端MOS为什么要自举电路 众所周知MOS是电压型驱动 只有G极比S极高一个开启电压Vth之后 MOS才会导通 这里指NMOS 但是如下图 我
  • JQuery 页面加载完成后执行事件

    一 document ready function code 二 jQuery document ready function code 三 window nl ad function code 四 将jquery代码放入body的后面 这
  • 使用OpenCV/python进行双目测距

    在做SLAM时 希望用到深度图来辅助生成场景 所以要构建立体视觉 在这里使用OpenCV的Stereo库和python来进行双目立体视觉的图像处理 立体标定 应用标定数据 转换成深度图 标定 在开始之前 需要准备的当然是两个摄相头 根据你的
  • 什么是 agent

    agent 是任何通过sensor感知其环境并通过actuators在此环境中作出行动的东西 比如人agent sensor 是眼睛 耳朵 以及其他器官 actuators 是手 腿 声道等 比如机器人agent sensor 是摄像头 红
  • JVM系列-第8章-执行引擎

    文章目录 toc 执行引擎 执行引擎概述 执行引擎概述 执行引擎工作过程 Java代码编译和执行过程 解释执行和即时编译 什么是解释器 什么是JIT编译器 机器码 指令 汇编语言 机器码 指令和指令集 汇编语言 高级语言 字节码 C C 源
  • Java使用图片压缩工具压缩图片的两种方法

    上代码 pom xml
  • 单元测试是什么?为什么要做单元测试?

    背锅侠 一个有个性的订阅号 1 单元测试是什么 单元测试是开发者编写的一小段代码 用于检验被测代码的一个很小的 很明确的功能是否正确 通常而言 一个单元测试是用于判断某个特定条件 或者场景 下某个特定函数的行为1 长按图片识别二维码 入群
  • [Qt 教程之Widgets模块] —— QButtonGroup抽象容器

    Qt系列教程总目录 文章目录 0 QButtonGroup简介 1 创建QButtonGroup 2 成员函数与信号 3 示例 3 1 为按钮组添加按钮 3 2 为按钮设置id 3 3 按钮组中按钮的互斥状态 3 4 获取组内所有按钮 3