pyQt5 学习笔记(16)QButtonGroup 按键分组

一、QButtonGroup 简介

QButtonGroup 继承自 QObject,不是一个可视类,它主要是对按键进行分组,便于按键管理。

二、QButtonGroup 创建

QRadioButton(单选框) 默认会与同父类的所有单选框互斥,可以通过QButtonGroup对单选框进行分类:

from PyQt5.Qt import *
import sys

app = QApplication(sys.argv)

w = QWidget()
w.setWindowTitle("QButtonGrounp")
w.resize(300, 150)

#创建第1组 QRadioButton 按钮
cs1 = QRadioButton("特大杯",w)
cs1.move(80, 20)

cs2 = QRadioButton("大杯",w)
cs2.move(80, 40)

cs3 = QRadioButton("中杯",w)
cs3.move(80, 60)

cs4 = QRadioButton("小杯",w)
cs4.move(80, 80)

#创建一个按键组,并添加按键
cs_group = QButtonGroup(w)
cs_group.addButton(cs1)
cs_group.addButton(cs2)
cs_group.addButton(cs3)
cs_group.addButton(cs4)

drs1 = QRadioButton("咖啡",w)
drs1.move(20, 20)

drs2 = QRadioButton("可乐",w)
drs2.move(20, 40)

drs3 = QRadioButton("豆浆",w)
drs3.move(20, 60)

drs_group = QButtonGroup(w)
drs_group.addButton(drs1)
drs_group.addButton(drs2)
drs_group.addButton(drs3)

w.show()

if __name__ == '__main__':
    sys.exit(app.exec_())

运行:
在这里插入图片描述
可以看到按键被分为2组:[咖啡,可乐,豆浆],[特大杯,大杯,中杯,小杯]。同组互斥,不同组则不互相影响。由于咖啡豆也是豆,所以现实生活中,豆浆就已经包含了咖啡。

第10~21行:程序创建了4个单选框,并设置了它们相对父控件的位置。
第24行: 创建一个按键分组
第25~28行:将4个按键添加到 cs_group 分租中

程序接着设置第2个分组,其原理同第1个分组。

三、功能(API)

1. 查看按钮和设置按钮ID

QButtonGroup 在添加按钮时,可以快捷的给按键设置一个ID(不指定会自动分配一个负值的ID),也可以通过buttons()查看所有按键,button()查看指定按键,以下程序示例了这个3个API函数的用法:

from PyQt5.Qt import *
import sys

app = QApplication(sys.argv)

w = QWidget()
w.setWindowTitle("QButtonGrounp")
w.resize(300, 150)

#创建第1组 QRadioButton 按钮
cs1 = QRadioButton("第1个",w)
cs1.move(20, 20)
#设置第一个单选框被选中
cs1.setChecked(True)

cs2 = QRadioButton("第2个",w)
cs2.move(20, 40)


#创建一个按键组,并添加按键
cs_group = QButtonGroup(w)
cs_group.addButton(cs1, 1)      #设置ID为1
cs_group.addButton(cs2, 2)

print(cs_group.buttons())       #打印所有按钮
print(cs_group.button(2))       #打印ID=2的按钮
print(cs_group.checkedButton()) #打印被按下的按钮

w.show()

if __name__ == '__main__':
    sys.exit(app.exec_())

运行:
在这里插入图片描述
运行时,“第1个”按钮已经被选中,同时可以根据打印信息,在控制台观察buttons()button()的运行情况。

2. 移除按钮

这里的移除按钮指的是将按钮移出QButtonGroup,而不是删除这个控件,通过removeButton()来实现:

from PyQt5.Qt import *
import sys

app = QApplication(sys.argv)

w = QWidget()
w.setWindowTitle("QButtonGrounp")
w.resize(300, 150)

#创建第1组 QRadioButton 按钮
cs1 = QRadioButton("第1个",w)
cs1.move(20, 20)
#设置第一个单选框被选中
cs1.setChecked(True)

cs2 = QRadioButton("第2个",w)
cs2.move(20, 40)

#创建一个按键组,并添加按键
cs_group = QButtonGroup(w)
cs_group.addButton(cs1, 1)
cs_group.addButton(cs2, 2)

#将cs2按键移出sc_group
cs_group.removeButton(cs2)

w.show()

if __name__ == '__main__':
    sys.exit(app.exec_())

运行
在这里插入图片描述
第25行:移除cs2,即使文本为“第二个”的按钮。
可以发现,上述程序“第1个”按钮和“第2个”按钮并不互斥,我们可以同时选择2个,这是因为它们已经属于不同的分组,所以并不互斥:
在这里插入图片描述

3. ID相关操作

ID可以在按钮组添加按键的时候设置,也可以通过setId()设置,可以通过id(),来返回,最后还可以通过``已下程序示例了这2个API的使用:

from PyQt5.Qt import *
import sys

app = QApplication(sys.argv)

w = QWidget()
w.setWindowTitle("QButtonGrounp")
w.resize(300, 150)

cs1 = QRadioButton("第1个",w)
cs1.move(20, 20)

cs1.setChecked(True)

cs2 = QRadioButton("第2个",w)
cs2.move(20, 40)

cs_group = QButtonGroup(w)
cs_group.addButton(cs1)
cs_group.addButton(cs2)

# 设置按钮ID
cs_group.setId(cs1,1) #cs1 id 为 1
cs_group.setId(cs2,2) #cs2 id 为 2

# 打印按键 id 以及被选择的按键ID
print(cs_group.id(cs1))
print(cs_group.id(cs2))
print(cs_group.checkedId())

w.show()

if __name__ == '__main__':
    sys.exit(app.exec_())

运行:
在这里插入图片描述

4. 独占设置

默认情况下,同一个按键分组的单选框是互斥的,即同时只能选择一个,在QRadioButton中,可以对单个按键设置不与其他按键互斥,QButtonGroup通用有类似的函数,setExclusive(),不同的是,当QButtonGroup设置互斥为False以后,该分组的所有按钮都不互斥了。以下程序示例了setExclusive()的用法:

from PyQt5.Qt import *
import sys

app = QApplication(sys.argv)

w = QWidget()
w.setWindowTitle("QButtonGrounp")
w.resize(300, 150)

#创建第1组 QRadioButton 按钮
cs1 = QRadioButton("特大杯",w)
cs1.move(80, 20)

cs2 = QRadioButton("大杯",w)
cs2.move(80, 40)

cs3 = QRadioButton("中杯",w)
cs3.move(80, 60)

cs4 = QRadioButton("小杯",w)
cs4.move(80, 80)

#创建一个按键组,并添加按键
cs_group = QButtonGroup(w)
cs_group.addButton(cs1)
cs_group.addButton(cs2)
cs_group.addButton(cs3)
cs_group.addButton(cs4)

# 设置cs_group不互斥
cs_group.setExclusive(False)

w.show()

if __name__ == '__main__':
    sys.exit(app.exec_())

运行:
在这里插入图片描述
可以看到它们之间不互斥,甚至可以取消,基本是一个复选框了。

四、信号

QButtonGroup 有多个信号:

信号含义
buttonClicked(int id /QAbstractButton *button)按键被点击
buttonPressed(int id /QAbstractButton *button)按键被点击
buttonReleased(int id /QAbstractButton *button)按键被释放
buttonToggled(int id, bool checked/QAbstractButton *button, bool checked)按键状态改变

上表格列出了4个信号,但是每一个信号的参数都可以是整型类型的信号,也可以是按键对象,在实际使用中,可以在信号函数名后面添加[]来指定发送的信号携带什么类型的参数,、
buttonCloicked为例,指定携带信号为id:

from PyQt5.Qt import *
import sys

app = QApplication(sys.argv)

w = QWidget()
w.setWindowTitle("QButtonGrounp")
w.resize(300, 150)

# 创建4个 QRadioButton 按钮
cs1 = QRadioButton("特大杯",w)
cs1.move(80, 20)

cs2 = QRadioButton("大杯",w)
cs2.move(80, 40)

cs3 = QRadioButton("中杯",w)
cs3.move(80, 60)

cs4 = QRadioButton("小杯",w)
cs4.move(80, 80)

# 创建一个按键组,并添加按键
cs_group = QButtonGroup(w)
cs_group.addButton(cs1,1)
cs_group.addButton(cs2,2)
cs_group.addButton(cs3,3)
cs_group.addButton(cs4,4)

# 定义槽函数,并打印接收到的参数
def slot(id):
    print("按键被按下了,id 为:",id)

# 连接槽函数,并制定带的参数会 int 类型
cs_group.buttonClicked[int].connect(slot)

w.show()

if __name__ == '__main__':
    sys.exit(app.exec_())

运行:
在这里插入图片描述
第35行:通过[]来指定参数

如果是多个参数,比如buttonToggled,中括号则写入多个参数,用“,”区分开来,如:
cs_group.buttonToggled[int,bool].connect(slot)或者是cs_group.buttonToggled[QAbstractButton,bool].connect(slot)slot为槽函数的名字,请记得视具体程序修改参数
如果我们使用了参数为按键对象的情况时候,也可以通过对象的方法id()来获取参数:

from PyQt5.Qt import *
import sys

app = QApplication(sys.argv)

w = QWidget()
w.setWindowTitle("QButtonGrounp")
w.resize(300, 150)

# 创建4个 QRadioButton 按钮
cs1 = QRadioButton("特大杯",w)
cs1.move(80, 20)

cs2 = QRadioButton("大杯",w)
cs2.move(80, 40)

cs3 = QRadioButton("中杯",w)
cs3.move(80, 60)

cs4 = QRadioButton("小杯",w)
cs4.move(80, 80)

# 创建一个按键组,并添加按键
cs_group = QButtonGroup(w)
cs_group.addButton(cs1,1)
cs_group.addButton(cs2,2)
cs_group.addButton(cs3,3)
cs_group.addButton(cs4,4)

# 定义槽函数,并打印接收到的参数
def slot(object):
    print("按键被按下了,id 为:", cs_group.id(object))

# 连接槽函数,并制定带的参数会 int 类型
cs_group.buttonClicked.connect(slot)
w.show()

if __name__ == '__main__':
    sys.exit(app.exec_())

运行:
在这里插入图片描述
第35行:为指定参数,默认参数是对象
第32行:通过id(),获取了该对象的 id 号

当程序只需要ID的时候,参数为ID是更方便的,因为不需要通过函数获取,但是如果需要更多的信息,只有id则是不够的,通常使用传入对象,然后根据具体情况获取所需要的信息。所以信号类型的选择,需要根据程序而定。

PyQt5是一个流行的Python GUI库,可以用于开发图形界面应用程序。关于笔记本电量的问题,PyQt5可以通过调用相关的系统API来获取电池的状态和电池电量信息。 在PyQt5中,可以使用QSystemTrayIcon类来创建系统托盘图标,并通过调用QSystemTrayIcon的相关方法实现获取电池信息并显示在托盘图标上。 首先,我们需要导入PyQt5和相关的模块: ```python from PyQt5.QtWidgets import QApplication, QSystemTrayIcon, QMenu, QAction from PyQt5.QtGui import QIcon from PyQt5.QtCore import Qt, QTimer ``` 然后,我们创建一个QApplication实例和一个QSystemTrayIcon实例: ```python app = QApplication([]) tray_icon = QSystemTrayIcon(QIcon('battery_icon.png'), app) ``` 接下来,我们定义一个函数来获取电池电量信息,并将其显示在托盘图标上: ```python def update_battery_info(): battery_info = app.primaryScreen().virtualSiblings()[0].backendObject().batteryInfo() battery_percentage = battery_info.percent() battery_status = battery_info.state() tray_icon.setToolTip(f'Battery: {battery_percentage}%, Status: {battery_status}') ``` 然后,我们创建一个定时器来定期更新电池电量信息: ```python timer = QTimer() timer.timeout.connect(update_battery_info) timer.start(10000) # 10秒更新一次 ``` 最后,我们在托盘图标上创建一个菜单,并将应用程序与托盘图标关联起来: ```python menu = QMenu() exit_action = QAction('Exit', app) exit_action.triggered.connect(app.quit) menu.addAction(exit_action) tray_icon.setContextMenu(menu) tray_icon.show() app.exec_() ``` 以上代码中的battery_icon.png是一个自定义的电池图标文件,可以根据自己的需求替换。 这样,当我们运行这段代码时,就会在系统托盘中显示一个电池图标,并且会定时更新电池电量信息。当我们单击右键时,会打开一个菜单,可以选择退出应用程序。 希望这个回答对您有帮助!
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值