QButtonGroup使用介绍

news2024/11/19 4:35:18

一、简介

QButtonGroup是PyQt5库中的一个组件,主要用于组织和管理一组按钮。通过QButtonGroup,可以方便地实现单选框或多选框功能,统一处理按钮的信号,并且可以为按钮分组设定ID以进行识别。

1、原始工程


from PyQt5.Qt import *
import sys

app = 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、解决方案

  1. 添加共同的父控件,此时同一个父控件内的QRadioButton互斥,但此种方式比较局限,且父控件是实体控件,不推荐。
  2. QButtonGroup方式,提供 一个抽象的按钮容器, 可以将多个按钮划分为一组,不具备可视化的效果,一般放的都是可以被检查的按钮,推荐使用。

二、功能介绍

1、创建和添加按钮

  1. api
api功能
addButton(QAbstractButton, id = -1)向按钮组中添加按钮
注:
  • 如果id为-1,则将为该按钮分配一个id。自动分配的ID保证为负数,从-2开始。
  • 如果要分配自己的ID,请使用正值以避免冲突
  1. 应用场景

    向按钮组中添加按钮, 并选择性设置ID。

  2. 代码

    from PyQt5.Qt import *
    import sys
    
    app = 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_())
    
  3. 测试结果

    在这里插入图片描述

2、查看按钮

  1. api

    api功能
    buttons()查看所有按钮组中的按钮
    button(ID)根据ID获取对应按钮, 没有则返回None
    checkedButton()获取选中的那个按钮
  2. 应用场景

    获取指定条件的按钮

  3. 修改代码

    
    from PyQt5.Qt import *
    import sys
    
    app = 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_())
    
    
    
  4. 测试结果

    在这里插入图片描述

3、移除按钮

  1. api

    api功能
    removeButton(QAbstractButton)移除指定按钮
  2. 应用场景

    移除指定按钮,只是从抽象关系上移除按钮。

  3. 修改代码

    
    from PyQt5.Qt import *
    import sys
    
    app = 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. 测试结果

    在这里插入图片描述

    打印发现只有一个按钮了。

4、QButtonGroup-ID操作

  1. api

    api功能
    setId(QAbstractButton,int)设置按钮id
    id(QAbstractButton)返回按钮对应的ID,如果不存在此按钮,则返回-1
    checkedId()选中按钮的ID,如果没有选中的按钮则返回-1
  2. 应用场景

    设置ID, 方便识别用户选项

  3. 修改代码,取消 size_group 添加button时设置的id,使用上述api操作

    
    from PyQt5.Qt import *
    import sys
    
    app = 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_())
    
    
    
  4. 测试结果

    在这里插入图片描述

5、独占操作(也就是按钮是否互斥)

  1. api

    api功能
    setExclusive(bool)设置QButtonGroup中的按钮是否具有独占性(互斥选择)
    exclusive()返回当前QButtonGroup的独占状态
  2. 应用场景

    统一设置按钮组中的按钮是否是独占(选择互斥)

  3. 修改代码

    
    from PyQt5.Qt import *
    import sys
    
    app = 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_())
    
    
    
  4. 测试结果

    在这里插入图片描述


三、信号

  1. api

    api功能
    buttonClicked(int/QAbstractButton)当按钮组中的按钮被点击时, 发射此信号
    buttonPressed(int/QAbstractButton)当按钮组中的按钮被按下时, 发射此信号
    buttonReleased(int/QAbstractButton)当按钮组中的按钮被释放时, 发射此信号
    buttonToggled(QAbstractButton/int, bool)当按钮组中的按钮被切换状态时, 发射此信号
  2. 应用场景

    监听用户的按钮点击事件,执行相应的逻辑操作。

  3. 修改代码

    
    from PyQt5.Qt import *
    import sys
    
    app = 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_())
    
    
    
  4. 测试结果

    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1428386.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

-运算符-

目录 一.算术运算符 (一).四则运算符:加减乘除模(-*/%) (二).增量运算符 - * % (三).自增/自减运算符 -- 二.关系运算符 ! < > < > 三.逻辑运算符&& || ! (一).逻辑与 (表达式1&&表达式2) (二).逻辑或 || (三).逻辑非 ! (四).…

JMeter 下载、安装、启动

JMeter安装部署依赖Java环境&#xff0c;所以首先得安装JDK。 JDK下载JDK环境变量配置 ① 新建系统环境变量JAVA_HOME ② 编辑系统变量Path ③ 新建系统变量CLASSPATH变量 JMeter下载安装 Apache JMeter - Apache JMeter™ JMeter安装部署依赖Java环境&#xff0c;所以首…

Framework - ActivityThread 应用启动UI渲染流程

一、概念 ActivityThread拥有 main(String[] agrs) 方法&#xff0c;作为程序的入口&#xff0c;是应用程序的初始化类。&#xff08;ActivityThread不是主线程&#xff0c;它在 main() 方法中实例化&#xff0c;是运行在主线程中。&#xff09;ApplicationThread是 ActivityT…

Docker搭建MySQL8主从复制

之前文章我们了解了面试官&#xff1a;说一说Binlog是怎么实现的&#xff0c;这里我们用Docker搭建主从复制环境。 docker安装主从MySQL 这里我们使用MySQL8.0.32版本&#xff1a; 主库配置 master.cnf //基础配置 [client] port3306 socket/var/run/mysqld/mysql.sock [m…

java(面向对象基础)

面向对象的三大特征&#xff1a;封装、继承、多态 一、封装 用 类设计对象处理某一个事物的数据时&#xff0c;应该把要处理的数据&#xff0c;以及处理这些数据的方法&#xff0c;设计到一个对象中去。 封装规范&#xff1a;合理隐藏&#xff0c;合理暴露&#xff08;先将成…

力扣hot100 编辑距离 多维DP

Problem: 72. 编辑距离 文章目录 思路Code 思路 &#x1f468;‍&#x1f3eb; 参考地址 Code ⏰ 时间复杂度: O ( n m ) O(nm) O(nm) &#x1f30e; 空间复杂度: O ( n m ) O(nm) O(nm) class Solution {public int minDistance(String s1, String s2){int n s1.lengt…

MongoDB基础认识

MongoDB数据库介绍 名称源自“humongous”&#xff08;意为“巨大无比”&#xff09;。MongoDB 是由C语言编写的&#xff0c;是一个基于分布式文件存储的开源数据库系统。在高负载的情况下&#xff0c;添加更多的节点&#xff0c;可以保证服务器性能。MongoDB 旨在为WEB应用提…

备战蓝桥杯---搜索(DFS基础1)

何为深搜&#xff1f; 即不撞南墙不罢休。 话不多说&#xff0c;直接看题&#xff1a; 我们可以把这看成深搜的模板题&#xff0c;下面是AC代码&#xff1a; #include<bits/stdc.h> using namespace std; int a[15];//存值并输出 int vis[15]; int n18; void dfs(int …

Nicn的刷题日常之喝汽水问题

目录 1.题目描述 2.解题思路 3.解题 4.思路2 解题 1.题目描述 喝汽水&#xff0c;1瓶汽水1元&#xff0c;2个空瓶可以换一瓶汽水&#xff0c;给20元&#xff0c;可以喝多少汽水&#xff08;编程实现&#xff09;。 2.解题思路 1. 20元首先可以喝20瓶&#xff0c;此时手…

书生浦语2-对话-20B大模型部署实践

简介 书生浦语2.0是一个大语言模型&#xff0c;是商汤科技与上海 AI 实验室联合香港中文大学和复旦大学发布的新一代大语言模型。‘ 具体特性 有效支持20万字超长上下文&#xff1a;模型在 20 万字长输入中几乎完美地实现长文“大海捞针”&#xff0c;而且在 LongBench 和 L…

Python程序设计 函数基础

简单函数 函数&#xff1a;就是封装了一段可被重复调用执行的代码块。通过此代码块可以实现大量代码的重复使用。 函数的使用包含两个步骤&#xff1a; 定义函数 —— 封装 独立的功能 调用函数 —— 享受 封装 的成果 函数的作用&#xff0c;在开发程序时&#xff0c;使用…

2024年美赛F题超详细思路

Problem F: Reducing Illegal Wildlife Trade 美赛F题以非法野生动物贸易为背景进行命题&#xff0c;需要我们选择客户进行一系列的问题。本文正式解题前需要收集客户的数据以及数据预处理。对于客户的选择&#xff0c;这里考虑的点在于该客户需要能够对非法贸易交易产生影响。…

el-upload子组件上传多张图片(上传为files或base64url)

场景&#xff1a; 在表单页&#xff0c;有图片需要上传&#xff0c;表单的操作行按钮中有上传按钮&#xff0c;点击上传按钮。 弹出el-dialog进行图片的上传&#xff0c;可以上传多张图片。 由于多个表单页都有上传多张图片的操作&#xff0c;因此将上传多图的el-upload定义…

6、基于机器学习的预测

应用机器学习的任何预测任务与这四个策略。 文章目录 1、简介1.1定义预测任务1.2准备预测数据1.3多步预测策略1.3.1多输出模型1.3.2直接策略1.3.3递归策略1.3.4DirRec 策略2、流感趋势示例2.1多输出模型2.2直接策略1、简介 在第二课和第三课中,我们将预测视为一个简单的回归问…

Python开源项目周排行 2024年第3周

ython 趋势周报&#xff0c;按周浏览往期 GitHub,Gitee 等最热门的Python开源项目&#xff0c;入选的项目主要参考GitHub Trending,部分参考了Gitee和其他。排名不分先后&#xff0c;都是当周相对热门的项目。 入选公式&#xff1d;70%GitHub Trending20%Gitee10%其他 关注微…

K8S-NFS-StorageClass

工作流程 K8s中部署NFS-StorageClass K8s的StorageClass提供了为集群动态创建PV的能力。 1.部署NFS服务 2.选择NFS的Provinisoner驱动 K8S中没有内置的NFS的制备器&#xff0c;而定义StorageClass的时候需要指定制备器&#xff08;Pervisioner&#xff09;,所以需要&#xf…

Pycharm Community 配置调试Behave

前提&#xff1a;python小白&#xff0c;临时搞python项目&#xff0c;公司限制使用Pycharm版本&#xff0c;故只能使用社区版&#xff0c;然而官方有明确说明&#xff1a;只有Professional版支持Behave。故研究了半天才整清楚社区版调试Behave的设置 没有进行下面的步骤之前&…

C++面试宝典第26题:螺旋矩阵

题目 给你一个正整数n,生成一个包含1到n的平方的所有元素,且元素按顺时针顺序螺旋排列成n x n的正方形矩阵。 示例: 输入:n = 3 输出:[[1,2,3],[8,9,4],[7,6,5]] 解析 螺旋矩阵是指按照顺时针(或逆时针)螺旋顺序排列元素的二维矩阵。比如:给定一个如下的3x3矩阵,按顺…

PSoc62™开发板之WDT应用

看门狗 看门狗定时器(WDT)是一种硬件定时器&#xff0c;在出现意外固件时自动复位设备执行路径。如果启用了WDT&#xff0c;则必须在固件中定期进行服务&#xff0c;以避免复位。否则&#xff0c;计时器失效并产生一个设备复位。此外&#xff0c;WDT可以用作中断源或在低功耗唤…

正点原子--STM32定时器学习笔记(1)(更新中....)

F1系列基本定时器&#xff08;TIM6 / TIM7&#xff09; 我们的目标是通过TIM6基本定时器定时500ms&#xff0c;让LED0每隔500ms闪一下&#xff01; 思路&#xff1a;使用定时器6&#xff0c;实现500ms产生一次定时器更新中断&#xff0c;在中断里执行“翻转LED0”。 定时器什…