Qt/C++学习系列之QButtonGroup的简单使用
Qt/C++学习系列之QButtonGroup的简单使用
- 前言
- QButtonGroup
- 刨析源码
- 具体使用
- 界面设计
- 具体函数使用
- 初始化
- 信号与槽函数(两种方式)
- 总结
前言
在练手项目中,使用了QButtonGroup。项目需求有互斥的要求,在使用QRadioButton的基础上,叠加使用QButtonGroup。通过使用了解到,除QRadioButton以外,QCheckBox也可以使用,提供统一的管理。
QButtonGroup
QButtonGroup是用于对一组按钮进行统一管理的类,可以定义多个QRadioButton或QCheckBox进行分组管理。从而确保其按钮按下的互斥逻辑或统一处理的逻辑。
刨析源码
class Q_WIDGETS_EXPORT QButtonGroup : public QObject
{Q_OBJECTQ_PROPERTY(bool exclusive READ exclusive WRITE setExclusive)
public:explicit QButtonGroup(QObject *parent = Q_NULLPTR);~QButtonGroup();void setExclusive(bool);bool exclusive() const;void addButton(QAbstractButton *, int id = -1);void removeButton(QAbstractButton *);QList<QAbstractButton*> buttons() const;QAbstractButton * checkedButton() const;// no setter on purpose!QAbstractButton *button(int id) const;void setId(QAbstractButton *button, int id);int id(QAbstractButton *button) const;int checkedId() const;Q_SIGNALS:void buttonClicked(QAbstractButton *);void buttonClicked(int);void buttonPressed(QAbstractButton *);void buttonPressed(int);void buttonReleased(QAbstractButton *);void buttonReleased(int);void buttonToggled(QAbstractButton *, bool);void buttonToggled(int, bool);private:Q_DISABLE_COPY(QButtonGroup)Q_DECLARE_PRIVATE(QButtonGroup)friend class QAbstractButton;friend class QAbstractButtonPrivate;
};
借助AI可以快速刨析一下源码,同时学习一下有关QButtonGroup的属性、成员函数:
- 添加和移除按钮:
addButton() 为将按钮添加到按钮组中,这里要注意(QAbstractButton *, int id = -1),id默认为-1,意味着如果在未添加按钮的情况下,直接做移除操作会出现-1的情况。
在很多时候要注意按钮组内是否有按钮,在程序编译的时候要初始化,进行按钮的添加。
removeButton() 为移除按钮。 - 设置互斥性:
setExclusive() 将分类为一组的按钮进行互斥设置。对于单选按钮组,通常设置为互斥(true),这样组内只能选择一个按钮;对于复选按钮组,通常设置为非互斥(false)。
exclusive() const:检查按钮组是否为互斥的,并反馈。 - 获取当前选中的按钮:
checkedButton() 获取当前选中的按钮。 - 通过 ID 操作按钮
button(int id) const:通过 ID 获取按钮。
setId(QAbstractButton *button, int id):为按钮设置一个唯一的 ID。
id(QAbstractButton *button) const:获取按钮的 ID。
checkedId() const:返回当前选中按钮的 ID。如果没有按钮被选中,则返回 -1。 - 信号和槽:(
因为继承QObject,这意味着它可以使用 Qt 的信号和槽机制。
)
QButtonGroup 提供了一些信号,例如 buttonClicked() 和 buttonPressed(),可以用于响应按钮的点击事件。
buttonClicked(QAbstractButton *):当按钮被点击时发出信号,传递按钮的指针。
buttonClicked(int):当按钮被点击时发出信号,传递按钮的 ID。
buttonPressed(QAbstractButton *)、buttonPressed(int):当按钮被按下时发出信号。
buttonReleased(QAbstractButton *)、buttonReleased(int):当按钮被释放时发出信号。
buttonToggled(QAbstractButton *, bool)、buttonToggled(int, bool):当按钮的状态切换时发出信号(仅适用于复选按钮)。
具体使用
在项目中,需要通过不同的QRadioButton来引导后续关于QComboBox的使用。那么在项目中,我是这么处理的。
界面设计
这里我拖了QgroupBox,在里面包含了三个QRadioButton,并且在选择QRadioButton的基础上需要刷新点亮对应的QComboBox。
具体函数使用
初始化
boardButtonGroup = new QButtonGroup(this);boardButtonGroup->addButton(ui->RBtn_xz_1, 0); // ID为0boardButtonGroup->addButton(ui->RBtn_xz_2, 1); // ID为1boardButtonGroup->addButton(ui->RBtn_xz_3, 2); // ID为2boardButtonGroup->setExclusive(true);for (int i = 1; i <= 12; ++i){ui->CB_xz_1->addItem(QString("选择2_%1").arg(i));ui->CB_xz_2->addItem(QString("选择3_%1").arg(i));}
- 创建QButtonGroup,并给QRadioButton进行标号。
- addItem初始化QComboBox控件的内容。
- setExclusive设置互斥逻辑。
信号与槽函数(两种方式)
- 脱离QButtonGroup进行控制:
connect(ui->RBtn_xz_2, &QRadioButton::toggled, ui->CB_xz_1, &QComboBox::setEnabled);connect(ui->RBtn_xz_3, &QRadioButton::toggled, ui->CB_xz_2, &QComboBox::setEnabled);
这里是将QRadioButton的 toggled 信号连接到 QComboBox 的 setEnabled 槽。
- 使用QButtonGroup
handleButtonClicked(boardButtonGroup->checkedId());
handleButtonClicked 函数:传入当前按钮组中选中的按钮的 ID。这里的checkedId()就是使用到QButtonGroup的ID。
QObject::connect(boardButtonGroup, QOverload<int>::of(&QButtonGroup::buttonClicked),[this](int id) {handleButtonClicked(id);});
这里是QButtonGroup 的 buttonClicked 信号连接到一个 lambda 表达式中。通过捕捉到的ID来进行handleButtonClicked函数的处理。
void MainWindow::handleButtonClicked(int id) {switch (id) {case 0: // RBtn_xz_1 被选中ui->CB_xz_1->setEnabled(false);ui->CB_xz_2->setEnabled(false);break;case 1: // RBtn_xz_2 被选中ui->CB_xz_1->setEnabled(true);ui->CB_xz_2->setEnabled(false);break;case 2: // RBtn_xz_3 被选中ui->CB_xz_1->setEnabled(false);ui->CB_xz_2->setEnabled(true);break;default:ui->CB_xz_1->setEnabled(false);ui->CB_xz_2->setEnabled(false);break;}
}
这个代码就是根据按钮的 ID 设置 QComboBox 的启用状态。
–
总结
本文从QButtonGroup的源码角度进行分析,仅仅简单介绍了QButtonGroup的使用。对于项目中的使用,两种方式那更倾向于哪一种呢?
相关文章:

Qt/C++学习系列之QButtonGroup的简单使用
Qt/C学习系列之QButtonGroup的简单使用 前言QButtonGroup刨析源码 具体使用界面设计具体函数使用初始化信号与槽函数(两种方式) 总结 前言 在练手项目中,使用了QButtonGroup。项目需求有互斥的要求,在使用QRadioButton的基础上&a…...

CETOL 6σ v12.1 三维公差分析软件现已可供下载
一、新版本发布 德克萨斯州麦金尼 — 2025年6月5日 —Sigmetrix 宣布其最新版本的 CETOL 6σ 公差分析软件(v12.1)现已可供立即下载。公差分析在诸多方面为企业发展带来益处。它通过平衡质量与制造成本,助力企业提升盈利能力。企业还可借此缩…...

【JavaEE】Spring Boot项目创建
Spring Boot介绍 在学习Spring Boot之前,我们先来认识一下Spring Spring官方是这样介绍的: 可以看到,Spring让Java程序更加快速,简单和安全。Spring对于速度,简单性和生产力的关注使其成为世界上最流行的Java框架 Sp…...

KAG与RAG在医疗人工智能系统中的多维对比分析
1、引言 随着人工智能技术的迅猛发展,大型语言模型(LLM)凭借其卓越的生成能力在医疗健康领域展现出巨大潜力。然而,这些模型在面对专业性、时效性和准确性要求极高的医疗场景时,往往面临知识更新受限、事实准确性不足以及幻觉问题等挑战。为解决这些问题,检索增强生成(…...
车牌识别技术解决方案
在城市化进程不断加速的背景下,小区及商业区域的车辆管理问题日益凸显。为解决这一问题,车牌识别技术应运而生,成为提升车辆管理效率与安全性的关键手段。本方案旨在详细介绍车牌识别系统的基本原理、功能设计、实施流程以及预期效益…...
C/C++ 面试复习笔记(4)
1.在多线程的 Linux 程序中,调用系统函数(如pthread_create 创建线程、pthread_mutex_lock 锁定互斥锁等)可能会返回错误码。 与单线程环境相比,多线程环境下的错误处理有哪些需要特别注意的地方?请举例说明如何在多线…...
Unity 大型手游碰撞性能优化指南
Unity 大型手游碰撞性能优化指南 版本: 2.1 作者: Unity性能优化团队 语言: 中文 前言 在Unity大型手游的开发征途中,碰撞检测如同一位隐形的舞者,它在游戏的物理世界中赋予物体交互的灵魂。然而,当这位舞者的舞步变得繁复冗余时,便会悄然消耗宝贵的计算资源,导致帧率下…...
Git仓库的创建
Git服务器准备 假设Git所在服务器为Ubuntu系统,IP地址10.17.1.5。 一. 准备运行git服务的git用户,这里用户名就直接设定为git。 1. 创建一个git用户组,并创建git用户。 sudo groupadd git sudo useradd git -g git 2. 创建git用户目录&…...

从零到一:Maven 快速入门教程
目录 Maven 简介Maven 是什么为什么使用 Maven? 安装 Maven下载 Maven 配置 Maven解压文件配置本地仓库保存路径配置国内仓库地址 Maven 的核心概念了解 pom.xml 文件坐标依赖范围生命周期compileprovidedruntimetestsystemimport 依赖传递依赖排除依赖循环 继承1. …...
DDD架构实战 领域层 事件驱动
目录 核心实现: 这种实现方式的优势: 在实际项目中,你可能需要: 事件驱动往往是在一个微服务内部实现的 领域时间是DDD架构中比较常见的概念 在领域层内部的一个模型更改了状态或者发生了一些行为 向外发送一些通知 这些通…...
c# List<string>.Add(s) 报错:UnsupportedOperationException
在使用c#读取目录下指定格式文件目录后,使用List<string>.Add 来保存文件名时,出现UnsupportedOperationException错误,找了好久不知道问题出在哪里。 以下是错误代码: using (var fbd new FolderBrowserDialog{Descripti…...

postman基础
前言 本次 Chat 将结合业界广为推崇和使用的 RestAPI 设计典范 Github API,详细介绍 Postman 接口测试工具的使用方法和实战技巧。 在开始这个教程之前,先聊一下为什么接口测试在现软件行业如此重要? 为什么我们要学习 Postman?…...

python训练营day45
知识点回顾: tensorboard的发展历史和原理tensorboard的常见操作tensorboard在cifar上的实战:MLP和CNN模型 效果展示如下,很适合拿去组会汇报撑页数: 作业:对resnet18在cifar10上采用微调策略下,用tensorbo…...
B+树知识点总结
核心目标:减少磁盘 I/O 数据库系统(如 MySQL)的主要性能瓶颈通常在于磁盘 I/O(读取和写入数据到物理硬盘的速度远慢于内存访问)。B 树的设计核心就是最大限度地减少访问数据时所需的磁盘 I/O 次数。 一、B 树的基本结…...

Halcon透视矩阵
在 Halcon中,透视变换矩阵用于将图像从一个视角转换到另一个视角,常用于图像校正和几何变换。以下是计算透视变换矩阵的步骤及代码示例。 透视形变图像校正的步骤 对图像左简单的处理,分割要校正的区域;提取区域的顶点坐标信息&…...
SpringCloud——OpenFeign
概述: OpenFeign是基于Spring的声明式调用的HTTP客户端,大大简化了编写Web服务客户端的过程,用于快速构建http请求调用其他服务模块。同时也是spring cloud默认选择的服务通信工具。 使用方法: RestTemplate手动构建: // 带查询…...

007-nlohmann/json 项目应用-C++开源库108杰
本课为 fswatch(第一“杰”)的示例项目加上对配置文件读取的支持,同时借助 第三“杰” CLI11 的支持,完美实现命令行参数与配置文件的逻辑统一。 012-nlohmann/json-4-项目应用 项目基于原有的 CMake 项目 HelloFSWatch 修改。 C…...

移动端测试岗位高频面试题及解析
文章目录 一、基础概念二、自动化测试三、性能测试四、专项测试五、安全与稳定性六、高级场景七、实战难题八、其他面题 一、基础概念 移动端测试与Web测试的核心区别? 解析:网络波动(弱网测试)、设备碎片化(机型适配&…...
gvim比较两个文件不同并合并差异
使用 gvim 比较两个文件的不同: 方式一,使用 gvim 同时打开两个待比较的文件。 比较通用方式是采用 gvim -d 选项,具体命令,如下: gvim -d <file1> <file2>方式二,先用 gvim 打开一个文件&am…...
App使用webview套壳引入h5(二)—— app内访问h5,顶部被手机顶部菜单遮挡问题,保留顶部安全距离
引入webview的页面添加safeAreaInsets,对weview的webviewStyles做处理 在myApp中改造 entry.vue代码如下 template><view class"entry-page" :style"{ paddingTop: safeAreaInsets.top px }"><web-view :webview-styles"we…...

Git GitHub Gitee
一、Git 是一个免费、开源的分布式版本控制系统。 版本控制:一种记录文件内容变化,以便将来查阅特定版本修订情况的系统。它最重要的就是可以记录文件修改历史记录,从而让用户可以看历史版本,方便版本切换。 1.和集中式版本控制…...
《深度体验 Egg.js:打造企业级 Node.js 应用的全景指南》
🚀 核心亮点:Koa 的二次觉醒 企业级基因:阿里多年双十一验证的框架稳定性插件化架构:config.plugins 实现功能模块即插即用渐进式演进:从 50 行代码到 5 万行代码的无缝扩容能力 🔧 实战配置解析ÿ…...
蓝桥杯2118 排列字母
问题描述 小蓝要把一个字符串中的字母按其在字母表中的顺序排列。 例如,LANQIAO 排列后为 AAILNOQ。 又如,GOODGOODSTUDYDAYDAYUP 排列后为 AADDDDDGGOOOOPSTUUYYY。 请问对于以下字符串,排列之后字符串是什么? WHERETHEREIS…...
Python应用break初解
大家好!作为 Python 初学者,控制循环的执行是编程中的基础技能之一。在本文中,我们将深入探讨break语句的用途和用法,帮助您更好地理解和掌握这一强大的工具。 定义: break是 Python 中的一个保留关键字,用于在循环中提前终止循环…...

PLSQLDeveloper配置OracleInstantClient连接Oracle数据库
PL/SQLDeveloper配置Oracle Instant Client连接Oracle数据库 文章目录 PL/SQLDeveloper配置Oracle Instant Client连接Oracle数据库 1. Oracle Instant Client下载与配置1. Oracle Instant Client下载2. Oracle Instant Client解压配置1. 解压2. 配置 2. PL/SQL Developer下载、…...
高股息打底+政策催化增强+永续经营兜底
通过分析农业银行(政策红利高股息)与长江电力(垄断资源现金流堡垒)的共性,提炼出以下策略框架: 1. 核心筛选标准 • 高股息防御性:股息率>3%,分红率稳定(40%…...
双电机差速控制的MATLAB Simulink仿真方案,使用PWM和PID调节实现360°转向与速度控制_可复现,有问题请联系博主
以下是一个双电机差速控制的MATLAB Simulink仿真方案,使用PWM和PID调节实现360转向与速度控制。方案包含系统建模、控制策略和仿真实现。 系统模型 差速运动学模型: 线速度 ( v = \frac{v_r + v_l}{2} )角速度 ( \omega = \frac{v_r - v_l}{d} )其中 ( v_r, v_l ) 为右/左轮线…...

【Oracle】触发器
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 触发器基础概述1.1 触发器的概念与特点1.2 触发器的分类1.3 触发器的执行顺序 2. DML触发器2.1 基础DML触发器2.1.1 INSERT触发器2.1.2 UPDATE触发器2.1.3 DELETE触发器 2.2 高级DML触发器2.2.1 复合触发器2…...

基于深度学习的无人机轨迹预测
完整代码见文末 随着无人机技术的不断发展,无人机在农业、物流、监控等领域的应用日益广泛。精准的轨迹预测不仅能够提高无人机飞行的效率和安全性,还能在应对复杂环境下的突发状况时做出迅速反应。因此,基于深度学习的无人机轨迹预测已成为…...

git连接本地仓库以及gitee
参考:gitee创建新仓库并上传代码_gitee新建仓库导入代码-CSDN博客 git初始化以及添加git分支 在idea查看master主分支 报错 原因gitee推送更新失败问题记录:remote: error: hook declined to update refs/heads/master-CSDN博客 取消邮箱暴露...