PyQt5系列教程(15):單選按鈕

上期我們學習了如何通過PyQt中複選框的使用,本期我們介紹一下複選框的兄弟單選按鈕(QRadioButton)。

今天完成的效果如下:

QRadioButton簡介

QRadioButton小部件提供了一個帶有文本標籤的單選按鈕(沒錯,本質上它還是一個按鈕)。

QRadioButton是一個選項按鈕,可以打開(選中)或關閉(取消選中)。單選按鈕通常為用戶提供「多選一」操作。在一組單選按鈕中,一次只能檢查一個單選按鈕;如果用戶選擇另一個按鈕,則先前選擇的按鈕被關閉。

單選按鈕默認為autoExclusive(自動互斥)。如果啟用了自動互斥功能,則屬於同一個父窗口小部件的單選按鈕的行為就屬於同一個互斥按鈕組的一部分。當然加入QButtonGroup中能夠實現多組單選按鈕互斥。

無論何時打開或關閉按鈕,都會發出toggled()信號。如果要在每次按鈕更改狀態時觸發某個操作,請連接到此信號。使用isChecked()來查看是否選擇了一個特定的按鈕。

就像QPushButton一樣,單選按鈕顯示文本,還可以選擇一個小圖標。該圖標是用setIcon()設置的。文本可以在構造函數中設置,也可以在setText()中設置。快捷鍵可以通過在文本前面加一個&符號來指定。

更多詳細的說明請見:QRadioButton Class

小例子

from PyQt5.QtWidgets import QWidget, QRadioButton, QApplication, QPushButton, QMessageBox, QButtonGroupnimport sysnnclass Example(QWidget):n def __init__(self):n super().__init__()n self.initUI()nn def initUI(self):nn self.rb11 = QRadioButton(你是,self)n self.rb12 = QRadioButton(我是,self)n self.rb13 = QRadioButton(他是,self)n self.rb21 = QRadioButton(大美女,self)n self.rb22 = QRadioButton(大帥哥,self)n self.rb23 = QRadioButton(小屁孩,self)nn bt1 = QPushButton(提交,self)n n #為節省行數,部分非重要代碼省略...nn self.bg1 = QButtonGroup(self)n self.bg1.addButton(self.rb11, 11)n self.bg1.addButton(self.rb12, 12)n self.bg1.addButton(self.rb13, 13)nn self.bg2 = QButtonGroup(self)n self.bg2.addButton(self.rb21, 21)n self.bg2.addButton(self.rb22, 22)n self.bg2.addButton(self.rb23, 23)nn self.info1 = n self.info2 = nn self.bg1.buttonClicked.connect(self.rbclicked)n self.bg2.buttonClicked.connect(self.rbclicked)n bt1.clicked.connect(self.submit)nn self.show()n n def submit(self):n if self.info1 == or self.info2 == :n QMessageBox.information(self,What?,貌似有沒有選的啊,快去選一個吧!)n else:n QMessageBox.information(self,What?,self.info1+self.info2)n n def rbclicked(self):n sender = self.sender()n if sender == self.bg1:n if self.bg1.checkedId() == 11:n self.info1 = 你是n elif self.bg1.checkedId() == 12:n self.info1 = 我是n elif self.bg1.checkedId() == 13:n self.info1 = 他是 n else:n self.info1 = n else:n if self.bg2.checkedId() == 21:n self.info2 = 大美女n elif self.bg2.checkedId() == 22:n self.info2 = 大帥哥n elif self.bg2.checkedId() == 23:n self.info2 = 小屁孩 n else:n self.info2 = nnif __name__ == __main__:n #常規代碼,省略...n

這個例子中我們建立了兩個單選按鈕分組,其中每個分組單選按鈕是互斥的,我們在每個分組中分別選擇一個單選按鈕,然後提交就得到相應的信息了。當然用單選按鈕和分組需要將其先導入。

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

新建6個單選按鈕。如果不增加分組,這個6個單選按鈕是互斥的,因為單選按鈕默認為autoExclusive(自動互斥)。如下:

self.bg1 = QButtonGroup(self)nself.bg1.addButton(self.rb11, 11)nself.bg1.addButton(self.rb12, 12)nself.bg1.addButton(self.rb13, 13)nnself.bg2 = QButtonGroup(self)nself.bg2.addButton(self.rb21, 21)nself.bg2.addButton(self.rb22, 22)nself.bg2.addButton(self.rb23, 23)n

將單選按鈕添加到分組中,同時分配一個id號。 這個函數的原型是這樣的:

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

函數默認的id是-1, 自動分配的ID保證為負數,從-2開始。 如果您正在分配自己的ID,請使用正值來避免衝突。

self.info1 = nself.info2 = n

這裡記錄我們選擇的按鈕。

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

當我們在分組中點擊給定按鈕的時候會發出buttonClicked()信號,同時我們連接到rbclicked這個槽函數上。

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

我們判斷到底是點了哪個分組,怎麼判斷?使用self.sender()函數將信號的產生對象送過來。然後根據checkedId()去獲得這個按鈕的id號,通過id號的判斷我們到底是點了哪個單選按鈕。

QButtonGroup.checkedButton()n

返回的是被選中的按鈕id,如果沒有選中按鈕,則返回-1。同時設定self.info1和self.info2的值。

def submit(self):n if self.info1 == or self.info2 == :n QMessageBox.information(self,What?,貌似有沒有選的啊,快去選一個吧!)n else:n QMessageBox.information(self,What?,self.info1+self.info2)n

這個就是當我們點擊提交按鈕的時候,根據self.info1和self.info2的值彈出相應的消息了。

總體來說,這個程序比較簡單。本打算本篇是講解QProgressDialog的另一個用法的,但是下筆之後還是感覺涉及到的知識點較多,對於初學者來說,理解較為吃力,還是循序漸進,等碰到了再一點一點講解吧。

ok,今天單選按鈕的介紹暫時就到這裡吧。下期我們再約。

如果你想要本次教程中的相關源碼,請關注微信公眾號:學點編程吧,發送pyqt515,會自動得到相應的百度網盤下載鏈接。


推薦閱讀:

PyQt5系列教程(18):微調框1
PyQt5系列教程(21):標籤(QLabel)
PyQt5系列教程(17):跑馬燈(進度條的使用)
PyQt5系列教程(7):界面搭建
Qt桌面開發的困惑?

TAG:Python | PyQt | Python教程 |