PyQt5系列教程(15):单选按钮

  • A+

文章来源:www.xdbcb8.com,转载请注明出处。

上期我们学习了如何通过PyQt中复选框的使用,本期我们介绍一下复选框的兄弟单选按钮(QRadioButton)。

完成效果

今天完成的效果如下:

 

QRadioButton简介

QRadioButton小部件提供了一个带有文本标签的单选按钮(没错,本质上它还是一个按钮)。

QRadioButton是一个选项按钮,可以打开(选中)或关闭(取消选中)。单选按钮通常为用户提供“多选一”操作。在一组单选按钮中,一次只能检查一个单选按钮;如果用户选择另一个按钮,则先前选择的按钮被关闭。

单选按钮默认为autoExclusive(自动互斥)。如果启用了自动互斥功能,则属于同一个父窗口小部件的单选按钮的行为就属于同一个互斥按钮组的一部分。当然加入QButtonGroup中能够实现多组单选按钮互斥。

无论何时打开或关闭按钮,都会发出toggled()信号。如果要在每次按钮更改状态时触发某个操作,请连接到此信号。使用isChecked()来查看是否选择了一个特定的按钮。

就像QPushButton一样,单选按钮显示文本,还可以选择一个小图标。该图标是用setIcon()设置的。文本可以在构造函数中设置,也可以在setText()中设置。快捷键可以通过在文本前面加一个&符号来指定。

更多详细的说明请见:QRadioButton Class

小例子

from PyQt5.QtWidgets import QWidget, QRadioButton, QApplication, QPushButton, QMessageBox, QButtonGroup
import sys

class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):

        self.rb11 = QRadioButton('你是',self)
        self.rb12 = QRadioButton('我是',self)
        self.rb13 = QRadioButton('他是',self)
        self.rb21 = QRadioButton('大美女',self)
        self.rb22 = QRadioButton('大帅哥',self)
        self.rb23 = QRadioButton('小屁孩',self)

        bt1 = QPushButton('提交',self)
    
        #为节省行数,部分非重要代码省略...

        self.bg1 = QButtonGroup(self)
        self.bg1.addButton(self.rb11, 11)
        self.bg1.addButton(self.rb12, 12)
        self.bg1.addButton(self.rb13, 13)

        self.bg2 = QButtonGroup(self)
        self.bg2.addButton(self.rb21, 21)
        self.bg2.addButton(self.rb22, 22)
        self.bg2.addButton(self.rb23, 23)

        self.info1 = ''
        self.info2 = ''

        self.bg1.buttonClicked.connect(self.rbclicked)
        self.bg2.buttonClicked.connect(self.rbclicked)
        bt1.clicked.connect(self.submit)

        self.show()
        
    def submit(self):
        if self.info1 == '' or self.info2 == '':
            QMessageBox.information(self,'What?','貌似有没有选的啊,快去选一个吧!')
        else:
            QMessageBox.information(self,'What?',self.info1+self.info2)
        
    def rbclicked(self):
        sender = self.sender()
        if sender == self.bg1:
            if self.bg1.checkedId() == 11:
                self.info1 = '你是'
            elif self.bg1.checkedId() == 12:
                self.info1 = '我是'
            elif self.bg1.checkedId() == 13:
                self.info1 = '他是'            
            else:
                self.info1 = ''
        else:
            if self.bg2.checkedId() == 21:
                self.info2 = '大美女'
            elif self.bg2.checkedId() == 22:
                self.info2 = '大帅哥'
            elif self.bg2.checkedId() == 23:
                self.info2 = '小屁孩'            
            else:
                self.info2 = ''

if __name__ == '__main__':
    #常规代码,省略...

这个例子中我们建立了两个单选按钮分组,其中每个分组单选按钮是互斥的,我们在每个分组中分别选择一个单选按钮,然后提交就得到相应的信息了。当然用单选按钮和分组需要将其先导入。

 

self.rb11 = QRadioButton('你是',self)
self.rb12 = QRadioButton('我是',self)
self.rb13 = QRadioButton('他是',self)
self.rb21 = QRadioButton('大美女',self)
self.rb22 = QRadioButton('大帅哥',self)
self.rb23 = QRadioButton('小屁孩',self)

新建6个单选按钮。如果不增加分组,这个6个单选按钮是互斥的,因为单选按钮默认为autoExclusive(自动互斥)。如下:

self.bg1 = QButtonGroup(self)
self.bg1.addButton(self.rb11, 11)
self.bg1.addButton(self.rb12, 12)
self.bg1.addButton(self.rb13, 13)

self.bg2 = QButtonGroup(self)
self.bg2.addButton(self.rb21, 21)
self.bg2.addButton(self.rb22, 22)
self.bg2.addButton(self.rb23, 23)

将单选按钮添加到分组中,同时分配一个id号。 这个函数的原型是这样的:

QButtonGroup.addButton(self, QAbstractButton, id: int = -1)

函数默认的id是-1, 自动分配的ID保证为负数,从-2开始。 如果您正在分配自己的ID,请使用正值来避免冲突。

 

self.info1 = ''
self.info2 = ''

这里记录我们选择的按钮。

 

self.bg1.buttonClicked.connect(self.rbclicked)
self.bg2.buttonClicked.connect(self.rbclicked)

当我们在分组中点击给定按钮的时候会发出buttonClicked()信号,同时我们连接到rbclicked这个槽函数上。

 

def rbclicked(self):
    sender = self.sender()
    if sender == self.bg1:
        if self.bg1.checkedId() == 11:
            self.info1 = '你是'
        elif self.bg1.checkedId() == 12:
            self.info1 = '我是'
        elif self.bg1.checkedId() == 13:
            self.info1 = '他是'            
        else:
            self.info1 = ''
    else:
        if self.bg2.checkedId() == 21:
            self.info2 = '大美女'
        elif self.bg2.checkedId() == 22:
            self.info2 = '大帅哥'
        elif self.bg2.checkedId() == 23:
            self.info2 = '小屁孩'            
        else:
            self.info2 = ''

我们判断到底是点了哪个分组,怎么判断?使用self.sender()函数将信号的产生对象送过来。然后根据checkedId()去获得这个按钮的id号,通过id号的判断我们到底是点了哪个单选按钮。

 

QButtonGroup.checkedButton()

返回的是被选中的按钮id,如果没有选中按钮,则返回-1。同时设定self.info1和self.info2的值。

 

def submit(self):
    if self.info1 == '' or self.info2 == '':
        QMessageBox.information(self,'What?','貌似有没有选的啊,快去选一个吧!')
    else:
        QMessageBox.information(self,'What?',self.info1+self.info2)

这个就是当我们点击提交按钮的时候,根据self.info1和self.info2的值弹出相应的消息了。

 

总体来说,这个程序比较简单。本打算本篇是讲解QProgressDialog的另一个用法的,但是下笔之后还是感觉涉及到的知识点较多,对于初学者来说,理解较为吃力,还是循序渐进,等碰到了再一点一点讲解吧。

ok,今天单选按钮的介绍暂时就到这里吧。下期我们再约。

如果你想要本次教程中的相关源码,请关注微信公众号:学点编程吧,发送pyqt515,会自动得到相应的百度网盘下载链接。

weinxin
学点编程吧
快来扫一扫关注吧!
小杨老师

发表评论

您必须才能发表评论!