GUI学习之七——单选框QRadioButton和QButtonGroup的学习总结
一.单选框QRadioButton的使用
1.类的描述
a.单选框按钮用于给用户提供若干选项中的单选操作,当一个被选中时,会自动取消选中的那个。(如果只有一个时可以通过单击该按钮改变其状态;而存在多个按钮时单击选中的按钮无法改变其状态)
b.单选按钮左侧会有一个圆形的图标来表示按钮被选中
c.QRadioButton继承了QAbstractButton类,具有父类所有的API。
2.创建
创建的方法和PushButton按钮的创建方式是一样的
rb_1 = QRadioButton('Yes',window) rb_1.move(100,200) rb_2 = QRadioButton('No',window) rb_2.move(100,220)
3.信号
单选按钮除了继承的信号外,最长用的信号为状态切换的信号
QRadioButton.toggled()
一般在按钮状态切换时候会发送信号,并传送是否被选中的信号。
rb_2.toggled.connect(lambda Checked:print(Checked)) #匿名函数接收了toggled传递的参数
还有一点要注意的是这个toggled是状态改变,而不是按钮被点击,区别就是在点击了按钮1时按钮2的状态也会改变,信号也会被发送。
4.多组互斥的问题
我们在讲QAbstractButton类时讲过按钮的互斥这个问题:在一个父控件内按钮是可以互斥的,但是如果存在多组的互斥怎么办?我们可以建立多个父控件
from PyQt5.Qt import * import sys app=QApplication(sys.argv) class MyWindow(QWidget): pass window = MyWindow() window.resize(800,600) label_1 = MyWindow(window) label_1.resize(800,300) # rb = QRadioButton(window_1) rb_1 = QRadioButton('Yes',label_1) rb_1.move(100,200) rb_2 = QRadioButton('No',label_1) rb_2.move(100,220) label_2 = QWidget(window) label_2.resize(800,200) label_2.move(0,300) rb_3 = QRadioButton('男',label_2) rb_3.move(50,20) rb_4 = QRadioButton('女',label_2) rb_4.move(50,60) window.show() sys.exit(app.exec_())
这样就可以使用多种互斥按钮了,可是每次添加这种控件比较麻烦,还要处理视觉上是否可见或遮挡其他控件的问题,那么就引出了下面的这个类——QButtonGroup。
二.QButtonGroup
1.描述
a.QButtonGroup提供了一个抽象的按钮容器,可以将按钮划分为一组。
b.QButtonGroup是继承自QObject,不具备可视化的效果。
c.一般QButtonGroup定义的组存放的都是可以被Checked的按钮。
2.建立按钮组,并将按钮存放在组内
from PyQt5.Qt import * import sys app=QApplication(sys.argv) class MyWindow(QWidget): pass window = MyWindow() btn_1 = QRadioButton('male',window) btn_2 = QRadioButton('female',window) btn_1.move(100,50) btn_2.move(100,80) btn_3 = QRadioButton('yes',window) btn_4 = QRadioButton('no',window) btn_3.move(200,50) btn_4.move(200,80) group_sex = QButtonGroup() #创建按钮组 group_sex.addButton(btn_1) #添加按钮 group_sex.addButton(btn_2)
3.按钮ID的分配、绑定和获取
在向按钮组内添加按钮时是有个ID的,这个值默认为-1(上个案例上没写就是默认值)。这个-1不是说添加的按钮ID值为-1,而是该值为系统自动分配的,自动分配的值为负数。
group.setId(btn,id=) #设定ID group.id(btn) #获取按钮ID,如果按钮不存在返回-1
4.查看按钮
group.buttons() #获取组内所有按钮对象 group.button() #按ID获取按钮,如果ID不存在返回值为None group.checkedId() #获取选中的按钮ID,无按钮被选中返回-1 group.checkedButton() #获取选中的按钮对象
5.移除按钮
group.removeButton()
注意这个按钮的移除不是从视觉上删除按钮,而是断开和组内其他按钮成员的逻辑关系。
6.互斥性设置
我们在QAbstractButton内讲了按钮的互斥性的设置,那是对单个按钮设置,这里还可以对组里的按钮统一设置
group.setExclusive(True) #设置组内按钮互斥 group.exclusive() #获取组内按钮是否互斥
7.信号使用
group.buttonClicked() #组内按钮被点击 group.buttonPressed() #组内按钮被按下 group.buttonReleased() #组内按下的按钮被释放 group.buttonToggled() #组内按钮状态切换
这里要插播一个重要的知识点:如果一个对象想外界提供的信号名称一样,但参数不一样,可以用下面的格式选择信号参数
singal_name[type]
singal——信号名称
type——信号类型
例如group.buttonClicked()可以发送 两种信号参数——按钮对象或按钮ID可以用
group.buttonClicked[int]
来改变信号参数。
group_sex.buttonClicked[int].connect(lambda data:print(data)) group_sex.buttonClicked.connect(lambda data:print(data))
看看打印出来的东西是不是不一样!