目錄
1、QPushButton按鈕類
2、QRadioButton按鈕類
3、QCheckBox按鈕類
在GUI設計中,按鈕都是最重要的和常用的觸發動作請求的方式,用來與使用者進行互動操作。在PyQt中根據不同的使用場景将按鈕劃分為不同的表現形式。
按鈕的基類是QAbstractButton,提供了按鈕的通用性功能。但是它不能執行個體化,必須由其他的按鈕類繼承QAbstractButton類,來實作不同的功能、不同的表現形式。
常見的按鈕類包括:QPushButton、QRadioButton和QCheckBox等。這些按鈕類均繼承自QAbstractButton類,根據各自的使用場景通過圖形展現出來。
QAbstractButton提供的狀态如下表所示:

QPushButton類繼承自QAbstractButton類,其形狀是長方形,文本标題或圖示可以顯示在長方形上。
QPushButton類是一種指令按鈕,可以單擊該按鈕執行一些指令,或者響應一些事件,常見的有:“确認"、"申請"、"取消"、"關閉"、"是"、"否"等按鈕。
QPushButton類中的常用方法如下表所示:
在這個例子中,建立了btn1、btn2、btn3和btn4四個按鈕,這四個QPushButton對象被定義為類的執行個體變量。每個按鈕都将clicked信号發送給指定的槽函數,以響應按鈕點選事件。
第1個按鈕btn1,通過toggle()函數來切換按鈕狀态。當點選這個按鈕時,将clicked信号發送給槽函數btnstate(),通過btn.isChecked來獲得按鈕是否被點選或釋放的狀态。還可以通過lambda的方式來傳遞額外的參數btn1,将clicked信号發送給槽函數whichbtn()。
第2個按鈕btn2,上面顯示一個圖示。使用setlcon()方法接收一個QPixmap對象的圖像檔案作為輸入參數。
第3個按鈕btn3,使用setEnabled()方法來禁用bnt3按鈕。
第4個按鈕btn4,使用setDefault()方法來設定按鈕的預設狀态。快捷鍵是“&+文本”(&Download),通過“Alt+D”快捷鍵來調用槽函數。
實作代碼如下所示:
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class Form(QDialog):
def __init__(self, parent=None):
super(Form, self).__init__(parent)
layout = QVBoxLayout()
self.btn1 = QPushButton("Button1")
self.btn1.setCheckable(True)
self.btn1.toggle()
self.btn1.clicked.connect(lambda:self.whichbtn(self.btn1) )
self.btn1.clicked.connect(self.btnstate)
layout.addWidget(self.btn1)
self.btn2 = QPushButton('image')
self.btn2.setIcon(QIcon(QPixmap("./python.png")))
self.btn2.clicked.connect(lambda:self.whichbtn(self.btn2) )
layout.addWidget(self.btn2)
self.setLayout(layout)
self.btn3 = QPushButton("Disabled")
self.btn3.setEnabled(False)
layout.addWidget(self.btn3)
self.btn4= QPushButton("&Download")
self.btn4.setDefault(True)
self.btn4.clicked.connect(lambda:self.whichbtn(self.btn4))
layout.addWidget(self.btn4)
self.setWindowTitle("Button demo")
def btnstate(self):
if self.btn1.isChecked():
print("button pressed" )
else:
print("button released" )
def whichbtn(self,btn):
print("clicked button is " + btn.text() )
if __name__ == '__main__':
app = QApplication(sys.argv)
btnDemo = Form()
btnDemo.show()
sys.exit(app.exec_())
QRadioButton類提供了一組可供選擇的按鈕和文本标簽,使用者可以選擇其中一個選項,标簽用于顯示對應的文本資訊。單選鈕是一種開關按鈕,可以切換為on或者off,即checked或者unchecked,主要是為使用者提供"多選一"的選擇。
QRadioButton是單選鈕控件預設是獨占的(Exclusive)。對于繼承自同一個父類Widget的多個單選鈕,它們屬于同一個按鈕組合,在單選鈕組裡,一次隻能選擇一個單選鈕。如果需要多個獨占的按鈕組合,則需要将它們放在QGroupBox或QButtonGroup中。
QRadioButton類中的常用方法如下表所示:
在QRadioButton中,toggled信号是在切換單選鈕狀态(開、關)時發射的,而clicked信号則在每次點選單選鈕時都會發射。在實際中,一般隻有狀态改變時才有必要去響應,是以toggled信号更适合用于狀态監控。
來看看QRadioButton按鈕類的示例,效果如下所示:
在這個例子中,兩個互斥的單選鈕被放置在視窗中。
第1個單選鈕btn1,被設定成預設選中狀态。
self.btn1.setChecked(True)
當選擇兩個按鈕互相切換時,按鈕的狀态發生改變,将觸發toggle信号,并與槽函數btnstate()連接配接。使用lambda的方式允許将源信号傳遞給槽函數,将按鈕作為參數。
self.btn1.toggled.connect(lambda:self.btnstate(self.btn1))
self.btn2.toggled.connect(lambda:self.btnstate(self.btn2))
當發射toggled信号後,使用btnstate()函數來檢查按鈕的狀态。
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class Radiodemo(QWidget):
def __init__(self, parent=None):
super(Radiodemo, self).__init__(parent)
layout = QHBoxLayout()
self.btn1 = QRadioButton("Button1")
self.btn1.setChecked(True)
self.btn1.toggled.connect(lambda:self.btnstate(self.btn1))
layout.addWidget(self.btn1)
self.btn2 = QRadioButton("Button2")
self.btn2.toggled.connect(lambda:self.btnstate(self.btn2))
layout.addWidget(self.btn2)
self.setLayout(layout)
self.setWindowTitle("RadioButton demo")
def btnstate(self,btn):
if btn.text()=="Button1":
if btn.isChecked() == True:
print( btn.text() + " is selected" )
else:
print( btn.text() + " is deselected" )
if btn.text()=="Button2":
if btn.isChecked()== True :
print( btn.text() + " is selected" )
else:
print( btn.text() + " is deselected" )
if __name__ == '__main__':
app = QApplication(sys.argv)
radioDemo = Radiodemo()
radioDemo.show()
sys.exit(app.exec_())
QCheckBox類提供了一組帶文本标簽的複選框,使用者可以選擇多個選項。和QPushButton一樣,複選框可以顯示文本或者圖示,其中文本可以通過構造函數或者setText()來設定;圖示可以通過setlcon()來設定。在視覺上,QButtonGroup可以把許多複選框組織在一起。
QCheckBox(複選框)和QRadioButton(單選鈕)都是選項按鈕,因為它們都可以在開(選中)或者關(未選中)之間切換。它們的差別是對使用者選擇的限制:單選鈕提供了“多選一"的選擇;而複選框提供的是“多選多"的選擇。
QCheckBox通常被應用在需要使用者選擇一個或多個可用的選項的場景中。
隻要複選框被選中或者取消選中,都會發射一個stateChanged 信号。如果想在複選框狀态改變時觸發相應的行為,請連接配接這個信号,可以使用isChecked()來查詢複選框是否被選中。
除了常用的選中和未選中兩種狀态,QCheckBox還提供了第三種狀态(半選中)來表明“沒有變化"。當需要為使用者提供一個選中或者未選中複選框的選擇時,這種狀态是很有用的。如果需要第三種狀态,則可以通過setTristate()來使它生效,并使用checkState()來查詢目前的切換狀态。
QCheckBox類中的常用方法如下表所示:
三态複選框有三種狀态,如下表所示:
來看看QCheckBox按鈕類的示例,效果如下所示:
在這個例子中,将三個複選框添加到一個水準布局管理器中,并添加到一個QGroupBox組中。
将三個複選框的stateChanged信号都連接配接到槽函數stateChanged()。使用lambda的方式傳遞對象給槽函數。當QCheckBox狀态改變時發射stateChanged信号,當信号發生改變時觸發自定義的槽函數btnstate()。
對上面三個複選框的控件說明,如下表所示:
執行個體化checkBox1和checkBox2兩個對象,并将checkBox1的狀态設定為選中,為checkBox1設定快捷鍵,使用“&"符号,如“&Checkbox 1",則通過“Alt+C"快捷鍵可以選中checkBox1複選框。
執行個體化一個QCheckBox類對象checkBox3,然後使用setTristate()開啟三态模式。
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
class CheckBoxDemo(QWidget):
def __init__(self, parent=None):
super(CheckBoxDemo , self).__init__(parent)
groupBox = QGroupBox("Checkboxes")
groupBox.setFlat( False )
layout = QHBoxLayout()
self.checkBox1= QCheckBox("&Checkbox1")
self.checkBox1.setChecked(True)
self.checkBox1.stateChanged.connect( lambda:self.btnstate(self.checkBox1) )
layout.addWidget(self.checkBox1)
self.checkBox2 = QCheckBox("Checkbox2")
self.checkBox2.toggled.connect( lambda:self.btnstate(self.checkBox2) )
layout.addWidget(self.checkBox2)
self.checkBox3 = QCheckBox("tristateBox")
self.checkBox3.setTristate(True)
self.checkBox3.setCheckState(Qt.PartiallyChecked )
self.checkBox3.stateChanged.connect( lambda:self.btnstate(self.checkBox3) )
layout.addWidget(self.checkBox3)
groupBox.setLayout(layout)
mainLayout = QVBoxLayout()
mainLayout.addWidget(groupBox)
self.setLayout(mainLayout)
self.setWindowTitle("checkbox demo")
def btnstate(self,btn ):
chk1Status = self.checkBox1.text()+", isChecked="+ str( self.checkBox1.isChecked() ) + ', chekState=' + str(self.checkBox1.checkState()) +"\n"
chk2Status = self.checkBox2.text()+", isChecked="+ str( self.checkBox2.isChecked() ) + ', checkState=' + str(self.checkBox2.checkState()) +"\n"
chk3Status = self.checkBox3.text()+", isChecked="+ str( self.checkBox3.isChecked() ) + ', checkState=' + str(self.checkBox3.checkState()) +"\n"
print(chk1Status + chk2Status + chk3Status )
if __name__ == '__main__':
app = QApplication(sys.argv)
checkboxDemo = CheckBoxDemo()
checkboxDemo.show()
sys.exit(app.exec_())
文章知識點與官方知識檔案比對,可進一步學習相關知識