一.單選框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))
看看打印出來的東西是不是不一樣!