QButtonGroup使用介绍
一、简介
QButtonGroup是PyQt5库中的一个组件,主要用于组织和管理一组按钮。通过QButtonGroup,可以方便地实现单选框或多选框功能,统一处理按钮的信号,并且可以为按钮分组设定ID以进行识别。
1、原始工程
from PyQt5.Qt import *
import sysapp = QApplication(sys.argv)window = QWidget()
window.setWindowTitle("按钮组的使用")
window.resize(500, 500)# 创建四个单选按钮
rb_male = QRadioButton("男", window)
rb_female = QRadioButton("女", window)
rb_male.move(100, 100)
rb_female.move(100, 150)rb_big = QRadioButton("大", window)
rb_small = QRadioButton("小", window)
rb_big.move(300, 100)
rb_small.move(300, 150)window.show()
sys.exit(app.exec_())
测试可发现,四个按钮都互斥,不符合使用逻辑。
2、解决方案
- 添加共同的父控件,此时同一个父控件内的QRadioButton互斥,但此种方式比较局限,且父控件是实体控件,不推荐。
- QButtonGroup方式,提供 一个抽象的按钮容器, 可以将多个按钮划分为一组,不具备可视化的效果,一般放的都是可以被检查的按钮,推荐使用。
二、功能介绍
1、创建和添加按钮
- api
| api | 功能 |
|---|---|
| addButton(QAbstractButton, id = -1) | 向按钮组中添加按钮 |
注:
- 如果id为-1,则将为该按钮分配一个id。自动分配的ID保证为负数,从-2开始。
- 如果要分配自己的ID,请使用正值以避免冲突
-
应用场景
向按钮组中添加按钮, 并选择性设置ID。
-
代码
from PyQt5.Qt import * import sysapp = QApplication(sys.argv)window = QWidget() window.setWindowTitle("按钮组的使用") window.resize(500, 500)#*******QButtonGroup创建和添加按钮 *******开始 # 创建四个单选按钮 rb_male = QRadioButton("男", window) rb_female = QRadioButton("女", window) rb_male.move(100, 100) rb_female.move(100, 150)rb_big = QRadioButton("大", window) rb_small = QRadioButton("小", window) rb_big.move(300, 100) rb_small.move(300, 150)# 创建QButtonGroup sex_group = QButtonGroup(window) sex_group.addButton(rb_male, 1) sex_group.addButton(rb_female, 2)size_group = QButtonGroup(window) size_group.addButton(rb_big, 1) size_group.addButton(rb_small, 2)#*******QButtonGroup创建和添加按钮 *******结束window.show() sys.exit(app.exec_()) -
测试结果

2、查看按钮
-
api
api 功能 buttons() 查看所有按钮组中的按钮 button(ID) 根据ID获取对应按钮, 没有则返回None checkedButton() 获取选中的那个按钮 -
应用场景
获取指定条件的按钮
-
修改代码
from PyQt5.Qt import * import sysapp = QApplication(sys.argv)window = QWidget() window.setWindowTitle("按钮组的使用") window.resize(500, 500)#*******QButtonGroup创建和添加按钮 *******开始 # 创建四个单选按钮 rb_male = QRadioButton("男", window) rb_female = QRadioButton("女", window) rb_male.move(100, 100) rb_female.move(100, 150) rb_female.setChecked(True)rb_big = QRadioButton("大", window) rb_small = QRadioButton("小", window) rb_big.move(300, 100) rb_small.move(300, 150)# 创建QButtonGroup sex_group = QButtonGroup(window) sex_group.addButton(rb_male, 1) sex_group.addButton(rb_female, 2)size_group = QButtonGroup(window) size_group.addButton(rb_big, 1) size_group.addButton(rb_small, 2)#*******QButtonGroup创建和添加按钮 *******结束#*******查看按钮*******开始print("查看 sex_group 中所有按钮:\n{}".format(sex_group.buttons())) print("查看 sex_group 中id为2的按钮:\n{}".format(sex_group.button(2))) print("查看 sex_group 中选中的按钮:\n{}".format(sex_group.checkedButton()))#*******查看按钮*******结束window.show() sys.exit(app.exec_()) -
测试结果

3、移除按钮
-
api
api 功能 removeButton(QAbstractButton) 移除指定按钮 -
应用场景
移除指定按钮,只是从抽象关系上移除按钮。
-
修改代码
from PyQt5.Qt import * import sysapp = QApplication(sys.argv)window = QWidget() window.setWindowTitle("按钮组的使用") window.resize(500, 500)#*******QButtonGroup创建和添加按钮 *******开始 # 创建四个单选按钮 rb_male = QRadioButton("男", window) rb_female = QRadioButton("女", window) rb_male.move(100, 100) rb_female.move(100, 150) rb_female.setChecked(True)rb_big = QRadioButton("大", window) rb_small = QRadioButton("小", window) rb_big.move(300, 100) rb_small.move(300, 150)# 创建QButtonGroup sex_group = QButtonGroup(window) sex_group.addButton(rb_male, 1) sex_group.addButton(rb_female, 2)size_group = QButtonGroup(window) size_group.addButton(rb_big, 1) size_group.addButton(rb_small, 2)#*******QButtonGroup创建和添加按钮 *******结束#*******查看按钮*******开始# print("查看 sex_group 中所有按钮:\n{}".format(sex_group.buttons())) # print("查看 sex_group 中id为2的按钮:\n{}".format(sex_group.button(2))) # print("查看 sex_group 中选中的按钮:\n{}".format(sex_group.checkedButton()))#*******查看按钮*******结束#*******移除按钮*******开始 sex_group.removeButton(rb_male) print("查看 sex_group 中所有按钮:\n{}".format(sex_group.buttons()))#*******移除按钮*******结束window.show() sys.exit(app.exec_()) -
测试结果

打印发现只有一个按钮了。
4、QButtonGroup-ID操作
-
api
api 功能 setId(QAbstractButton,int) 设置按钮id id(QAbstractButton) 返回按钮对应的ID,如果不存在此按钮,则返回-1 checkedId() 选中按钮的ID,如果没有选中的按钮则返回-1 -
应用场景
设置ID, 方便识别用户选项
-
修改代码,取消 size_group 添加button时设置的id,使用上述api操作
from PyQt5.Qt import * import sysapp = QApplication(sys.argv)window = QWidget() window.setWindowTitle("按钮组的使用") window.resize(500, 500)#*******QButtonGroup创建和添加按钮 *******开始 # 创建四个单选按钮 rb_male = QRadioButton("男", window) rb_female = QRadioButton("女", window) rb_male.move(100, 100) rb_female.move(100, 150) rb_female.setChecked(True)rb_big = QRadioButton("大", window) rb_small = QRadioButton("小", window) rb_big.move(300, 100) rb_small.move(300, 150)# 创建QButtonGroup sex_group = QButtonGroup(window) sex_group.addButton(rb_male, 1) sex_group.addButton(rb_female, 2)size_group = QButtonGroup(window) size_group.addButton(rb_big) size_group.addButton(rb_small)#*******QButtonGroup创建和添加按钮 *******结束#*******查看按钮*******开始# print("查看 sex_group 中所有按钮:\n{}".format(sex_group.buttons())) # print("查看 sex_group 中id为2的按钮:\n{}".format(sex_group.button(2))) # print("查看 sex_group 中选中的按钮:\n{}".format(sex_group.checkedButton()))#*******查看按钮*******结束#*******移除按钮*******开始 # sex_group.removeButton(rb_male) # print("查看 sex_group 中所有按钮:\n{}".format(sex_group.buttons()))#*******移除按钮*******结束#*******id操作*******开始 size_group.setId(rb_big, 1) size_group.setId(rb_small, 2)# 打印按钮id print("rb_big按钮id:{}".format(size_group.id(rb_big)))# 打印被选中的按钮id print("打印被选中的按钮id:{}".format(size_group.checkedId()))#*******id操作*******结束window.show() sys.exit(app.exec_()) -
测试结果

5、独占操作(也就是按钮是否互斥)
-
api
api 功能 setExclusive(bool) 设置QButtonGroup中的按钮是否具有独占性(互斥选择) exclusive() 返回当前QButtonGroup的独占状态 -
应用场景
统一设置按钮组中的按钮是否是独占(选择互斥)
-
修改代码
from PyQt5.Qt import * import sysapp = QApplication(sys.argv)window = QWidget() window.setWindowTitle("按钮组的使用") window.resize(500, 500)#*******QButtonGroup创建和添加按钮 *******开始 # 创建四个单选按钮 rb_male = QRadioButton("男", window) rb_female = QRadioButton("女", window) rb_male.move(100, 100) rb_female.move(100, 150) rb_female.setChecked(True)rb_big = QRadioButton("大", window) rb_small = QRadioButton("小", window) rb_big.move(300, 100) rb_small.move(300, 150)# 创建QButtonGroup sex_group = QButtonGroup(window) sex_group.addButton(rb_male, 1) sex_group.addButton(rb_female, 2)size_group = QButtonGroup(window) size_group.addButton(rb_big) size_group.addButton(rb_small)#*******QButtonGroup创建和添加按钮 *******结束#*******查看按钮*******开始# print("查看 sex_group 中所有按钮:\n{}".format(sex_group.buttons())) # print("查看 sex_group 中id为2的按钮:\n{}".format(sex_group.button(2))) # print("查看 sex_group 中选中的按钮:\n{}".format(sex_group.checkedButton()))#*******查看按钮*******结束#*******移除按钮*******开始 # sex_group.removeButton(rb_male) # print("查看 sex_group 中所有按钮:\n{}".format(sex_group.buttons()))#*******移除按钮*******结束#*******id操作*******开始 # size_group.setId(rb_big, 1) # size_group.setId(rb_small, 2)# 打印按钮id # print("rb_big按钮id:{}".format(size_group.id(rb_big)))# 打印被选中的按钮id # print("打印被选中的按钮id:{}".format(size_group.checkedId()))#*******id操作*******结束#*******独占状态*******开始 print("sex_group的独占性为:{}".format(sex_group.exclusive())) # 设置独占性 为 非独占 sex_group.setExclusive(False) print("修改后,sex_group的独占性为:{}".format(sex_group.exclusive()))#*******独占状态*******结束window.show() sys.exit(app.exec_()) -
测试结果

三、信号
-
api
api 功能 buttonClicked(int/QAbstractButton) 当按钮组中的按钮被点击时, 发射此信号 buttonPressed(int/QAbstractButton) 当按钮组中的按钮被按下时, 发射此信号 buttonReleased(int/QAbstractButton) 当按钮组中的按钮被释放时, 发射此信号 buttonToggled(QAbstractButton/int, bool) 当按钮组中的按钮被切换状态时, 发射此信号 -
应用场景
监听用户的按钮点击事件,执行相应的逻辑操作。
-
修改代码
from PyQt5.Qt import * import sysapp = QApplication(sys.argv)window = QWidget() window.setWindowTitle("按钮组的使用") window.resize(500, 500)#*******QButtonGroup创建和添加按钮 *******开始 # 创建四个单选按钮 rb_male = QRadioButton("男", window) rb_female = QRadioButton("女", window) rb_male.move(100, 100) rb_female.move(100, 150) rb_female.setChecked(True)rb_big = QRadioButton("大", window) rb_small = QRadioButton("小", window) rb_big.move(300, 100) rb_small.move(300, 150)# 创建QButtonGroup sex_group = QButtonGroup(window) sex_group.addButton(rb_male, 1) sex_group.addButton(rb_female, 2)size_group = QButtonGroup(window) size_group.addButton(rb_big) size_group.addButton(rb_small)#*******QButtonGroup创建和添加按钮 *******结束#*******查看按钮*******开始# print("查看 sex_group 中所有按钮:\n{}".format(sex_group.buttons())) # print("查看 sex_group 中id为2的按钮:\n{}".format(sex_group.button(2))) # print("查看 sex_group 中选中的按钮:\n{}".format(sex_group.checkedButton()))#*******查看按钮*******结束#*******移除按钮*******开始 # sex_group.removeButton(rb_male) # print("查看 sex_group 中所有按钮:\n{}".format(sex_group.buttons()))#*******移除按钮*******结束#*******id操作*******开始 # size_group.setId(rb_big, 1) # size_group.setId(rb_small, 2)# 打印按钮id # print("rb_big按钮id:{}".format(size_group.id(rb_big)))# 打印被选中的按钮id # print("打印被选中的按钮id:{}".format(size_group.checkedId()))#*******id操作*******结束#*******独占状态*******开始 # print("sex_group的独占性为:{}".format(sex_group.exclusive())) # 设置独占性 为 非独占 # sex_group.setExclusive(False) # print("修改后,sex_group的独占性为:{}".format(sex_group.exclusive()))#*******独占状态*******结束#*******信号*******开始 def on_button_clicked(button):print(f"Button clicked: {button.text()}")sex_group.buttonClicked.connect(on_button_clicked)#*******信号*******结束window.show() sys.exit(app.exec_()) -
测试结果

相关文章:
QButtonGroup使用介绍
一、简介 QButtonGroup是PyQt5库中的一个组件,主要用于组织和管理一组按钮。通过QButtonGroup,可以方便地实现单选框或多选框功能,统一处理按钮的信号,并且可以为按钮分组设定ID以进行识别。 1、原始工程 from PyQt5.Qt import …...
最近nvm安装报错的原因找到了——npm原淘宝镜像正式到期!
前言 📫 大家好,我是南木元元,热爱技术和分享,欢迎大家交流,一起学习进步! 🍅 个人主页:南木元元 目录 背景 错误原因 问题排查 淘宝镜像 证书到期 问题解决 结语 背景 我们…...
docker面试问题二
如何防止Docker容器中的漏洞和攻击? 防止Docker容器中的漏洞和攻击是一个多层次、多方面的任务,涉及从镜像构建、容器运行到网络安全的整个生命周期。以下是一些关键措施: 使用官方和受信任的镜像: 总是从官方源或受信任的第三方…...
嵌入式中C 语言中的三块技术难点
C 语言在嵌入式学习中是必备的知识,甚至大部分操作系统都要围绕 C 语言进行,而其中有三块技术难点,几乎是公认级别的“难啃的硬骨头”。 今天就来带你将这三块硬骨头细细拆解开来,一定让你看明白了。 0x01 指针 指针是公认最难理…...
基于SSM的个性化旅游攻略定制系统设计与实现(有报告)。Javaee项目。ssm项目。
演示视频: 基于SSM的个性化旅游攻略定制系统设计与实现(有报告)。Javaee项目。ssm项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构…...
[React源码解析] Fiber (二)
在React15及以前, Reconciler采用递归的方式创建虚拟Dom, 但是递归过程不可以中断, 如果组件的层级比较深的话, 递归会占用线程很多时间, 那么会造成卡顿。 为了解决这个问题, React16将递归的无法中断的更新重构为异步的可中断更新, Fiber架构诞生。 文章目录 1.Fiber的结构2…...
Nginx 多项目部署,vue刷新404 解决方案
网上找的资料大多都解决不了,废话不多说直接告诉你解决方法。 环境是 TP6 VUE前端官网 VUE 后台管理 部署 两个项目 刷新 404 解决方案 Nginx 配置 直接贴图 如果解决了,给我顶起来,让更多人 快速的解决。...
[C++]类和对象(中)
一:类的六个默认成员函数 如果一个类中什么成员都没有,简称为空类。空类中并不是什么都没有,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。默认成员函数:用户没有显式实现,编译器会生成的成员函数称为…...
Kubernetes operator(五)api 和 apimachinery 篇
云原生学习路线导航页(持续更新中) 本文是 Kubernetes operator学习 系列第五篇,主要对 k8s.io/api 和 k8s.io/apimachinery 两个项目 进行学习基于 kubernetes v1.24.0 代码分析Kubernetes operator学习系列 快捷链接 Kubernetes operator&a…...
接口自动化测试中解决接口间数据依赖
在实际的测试工作中,在做接口自动化测试时往往会遇到接口间数据依赖问题,即API_03的请求参数来源于API_02的响应数据,API_02的请求参数又来源于API_01的响应数据。 因此通过自动化方式测试API_03接口时,需要预先请求API_02接口&a…...
七、测试计划(软件工程)
1.引言 1.1编写目的 1.2项目背景 1.3定义 1.4参考资料 2.任务概述 2.1目标 2.2运行环境 2.3需求概述 2.4条件与限制 3.计划 3.1测试方案 3.2测试项目 3.3测试准备 3.4测试机构及人员 4.测试项目说明…...
ElementUI Form:Checkbox 多选框
ElementUI安装与使用指南 Checkbox 多选框 点击下载learnelementuispringboot项目源码 效果图 el-checkbox.vue (Checkbox 多选框)页面效果图 项目里el-checkbox.vue代码 <script> const cityOptions [上海, 北京, 广州, 深圳] export def…...
如何统一监听Vue组件报错
window.onerror 全局监听所有JS错误,包括异步错误但是它是JS级别的,识别不了Vue组件信息,Vue内部的错误还是用Vue来监听捕捉一些Vue监听不到的错误 errorCaptured生命周期 监听所有下级组件的错误返回false会阻止向上传播到window.onerror …...
python爬虫4
#1.练习 # (1) 获取网页的源码 # (2) 解析 解析的服务器响应的文件 etree.HTML # (3) 打印 import urllib.request urlhttps://www.baidu.com/ headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit…...
【算法】约数之和(数论)
题目 给定 n 个正整数 ai,请你输出这些数的乘积的约数之和,答案对 1097 取模。 输入格式 第一行包含整数 n。 接下来 n 行,每行包含一个整数 ai。 输出格式 输出一个整数,表示所给正整数的乘积的约数之和,答案需…...
走进CSS过渡效果的奇妙世界:详解CSS Transition
你是否曾在网页上看到一些酷炫的元素在状态变化时平滑而流畅地过渡?这就是CSS过渡效果的魔力所在!在这篇博客中,我们将深入探讨CSS Transition,揭示其神奇的原理和如何在你的网页中运用这项技术。 什么是CSS Transitionÿ…...
C++入坑基础知识点
当学习了C语言之后,很多的小伙伴都想进一步学习C,但两者有相当一部分的内容都是重叠的,不知道该从哪些方面开始入门C,这篇文章罗列了从C到C必学的入门知识,学完就算是踏入C的大门了。 1. 命名空间 写C的时候ÿ…...
RabbitMQ面试
1. 什么是消息中间件 消息中间件是在分布式系统中传递消息的软件服务。它允许不同的系统组件之间通过消息进行通信,而无需直接连接到彼此。消息中间件通常用于解耦系统的各个部分,提高系统的可扩展性、灵活性和可维护性。 2. 消息中间件解决了什么问题…...
计算机网络(第六版)复习提纲21
SS4.6 互联网的路由选择协议 1 关于路由选择协议的基本概念 A 理想的路由算法(路由选择协议的核心)157 1 算法是正确和完整的 2 计算上简单 3 能适应通信量和网络拓扑的变化(自适应性) 4 稳定性 5 公平性 6 应当最佳(特…...
2路DIN2路DO2路AIN远程4GRTU模块钡铼技术S270
钡铼技术的S270远程4G RTU模块是一款高性能的工业级远程终端单元,它支持2路数字输入(DIN)、2路数字输出(DO)以及2路模拟输入(AIN),并通过4G网络实现数据的远程传输。这种模块的设计旨在满足各种工业自动化和监控需求,特别适用于那些位于偏远地…...
OpenClaw与Qwen3-14B联调指南:解决模型响应超时与截断问题
OpenClaw与Qwen3-14B联调指南:解决模型响应超时与截断问题 1. 问题背景与挑战 上周我在尝试用OpenClaw自动化处理一批技术文档时,遇到了一个棘手的问题:当任务链超过5个步骤时,Qwen3-14B模型经常出现响应超时或输出截断。这直接…...
实测联想小新Pro 16 GT:一台把性能、AI和续航拉满的AI PC
最近体验了联想小新Pro 16 GT AI元启版,它不像是传统轻薄本,更像一台兼顾便携、性能和智能体验的全能机型。抛开品牌滤镜,单看硬件和实际使用,确实有不少值得一说的亮点。外观轻薄耐看,屏幕和接口都很实在这台机器用了…...
Flutter集成鸿蒙适配三方库:基础级鸿蒙应用开发实践案例
Flutter集成鸿蒙适配三方库:基础级鸿蒙应用开发实践案例 欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net 本文聚焦基础级开发场景,以“Flutter搭建鸿蒙应用集成鸿蒙适配版三方库”为核心,提供一步一操作…...
Redis 缓存三大坑:穿透、雪崩与布隆过滤器(新手入门指南)
开篇:为什么你必须懂这三个知识点?想象你开了一家奶茶店。顾客点单时,你会先看已经做好的成品区(缓存)有没有现成的奶茶,有就直接端走;没有再让后厨(数据库)现做。这个流…...
AI论文生成工具推荐:7款高效平台(含爱毕业aibiye)支持自动排版与LaTeX智能匹配
工具快速对比排名(前7推荐) 工具名称 核心功能亮点 处理时间 适配平台 aibiye 学生/编辑双模式降AIGC 1分钟 知网、万方等 aicheck AI痕迹精准弱化查重一体 ~20分钟 知网、格子达、维普 askpaper AIGC率个位数优化 ~20分钟 高校检测规则通…...
别只盯着价格!用统计学和三角函数“解剖”波场哈希:一份给数据科学家的区块链数据分析指南
区块链哈希值的数据科学探索:从统计建模到三角分析 区块链技术正在重塑数据科学的边界,而哈希值作为其核心组件之一,蕴含着丰富的数学特征等待挖掘。对于具备统计学基础的研究者而言,这些看似随机的字符串实际上是绝佳的研究样本。…...
城通网盘限速破解终极指南:ctfileGet工具让你免费享受10倍下载速度
城通网盘限速破解终极指南:ctfileGet工具让你免费享受10倍下载速度 【免费下载链接】ctfileGet 获取城通网盘一次性直连地址 项目地址: https://gitcode.com/gh_mirrors/ct/ctfileGet 你是否曾经被城通网盘的限速下载折磨得痛不欲生?面对几十KB/s…...
Seeed rpcBLE库:RTL8720DN平台的Arduino兼容BLE开发方案
1. 项目概述 Seeed Arduino rpcBLE 是一款面向嵌入式开发者的轻量级蓝牙低功耗(BLE)软件库,专为基于 Realtek RTL8720DN SoC 的 Seeed Studio 开发板(如 Wio Terminal、Wio-E5、W600 系列)设计。该库并非从零实现 BLE…...
避坑指南:Maya LiveLink插件安装常见报错解决方案(附FBX传输优化技巧)
Maya LiveLink插件避坑实战:从安装报错到FBX传输优化的全流程指南 每次打开Maya准备大干一场时,那个熟悉的.mll加载失败弹窗就像个不速之客——特别是当你需要在截止日期前完成虚幻引擎的动画对接时。作为连接Maya与虚幻引擎的神经中枢,LiveL…...
从零到专业:League Director 让你的英雄联盟回放变成电影级大片
从零到专业:League Director 让你的英雄联盟回放变成电影级大片 【免费下载链接】leaguedirector League Director is a tool for staging and recording videos from League of Legends replays 项目地址: https://gitcode.com/gh_mirrors/le/leaguedirector …...
