天天看點

Python Qt GUI設計:QPushButton、QRadioButton和QCheckBox按鈕類(基礎篇—12)

目錄

1、QPushButton按鈕類

2、QRadioButton按鈕類

3、QCheckBox按鈕類

在GUI設計中,按鈕都是最重要的和常用的觸發動作請求的方式,用來與使用者進行互動操作。在PyQt中根據不同的使用場景将按鈕劃分為不同的表現形式。

按鈕的基類是QAbstractButton,提供了按鈕的通用性功能。但是它不能執行個體化,必須由其他的按鈕類繼承QAbstractButton類,來實作不同的功能、不同的表現形式。

常見的按鈕類包括:QPushButton、QRadioButton和QCheckBox等。這些按鈕類均繼承自QAbstractButton類,根據各自的使用場景通過圖形展現出來。

QAbstractButton提供的狀态如下表所示:

Python Qt GUI設計:QPushButton、QRadioButton和QCheckBox按鈕類(基礎篇—12)
QAbstractButton提供的信号如下表所示:
Python Qt GUI設計:QPushButton、QRadioButton和QCheckBox按鈕類(基礎篇—12)

QPushButton類繼承自QAbstractButton類,其形狀是長方形,文本标題或圖示可以顯示在長方形上。

QPushButton類是一種指令按鈕,可以單擊該按鈕執行一些指令,或者響應一些事件,常見的有:“确認"、"申請"、"取消"、"關閉"、"是"、"否"等按鈕。

QPushButton類中的常用方法如下表所示:

Python Qt GUI設計:QPushButton、QRadioButton和QCheckBox按鈕類(基礎篇—12)
來看看QPushButton按鈕類的示例,效果如下所示:
Python Qt GUI設計:QPushButton、QRadioButton和QCheckBox按鈕類(基礎篇—12)

在這個例子中,建立了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類中的常用方法如下表所示:

Python Qt GUI設計:QPushButton、QRadioButton和QCheckBox按鈕類(基礎篇—12)

在QRadioButton中,toggled信号是在切換單選鈕狀态(開、關)時發射的,而clicked信号則在每次點選單選鈕時都會發射。在實際中,一般隻有狀态改變時才有必要去響應,是以toggled信号更适合用于狀态監控。

來看看QRadioButton按鈕類的示例,效果如下所示:

Python Qt GUI設計:QPushButton、QRadioButton和QCheckBox按鈕類(基礎篇—12)

在這個例子中,兩個互斥的單選鈕被放置在視窗中。

第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類中的常用方法如下表所示:

Python Qt GUI設計:QPushButton、QRadioButton和QCheckBox按鈕類(基礎篇—12)

三态複選框有三種狀态,如下表所示:

Python Qt GUI設計:QPushButton、QRadioButton和QCheckBox按鈕類(基礎篇—12)

來看看QCheckBox按鈕類的示例,效果如下所示:

Python Qt GUI設計:QPushButton、QRadioButton和QCheckBox按鈕類(基礎篇—12)

在這個例子中,将三個複選框添加到一個水準布局管理器中,并添加到一個QGroupBox組中。

将三個複選框的stateChanged信号都連接配接到槽函數stateChanged()。使用lambda的方式傳遞對象給槽函數。當QCheckBox狀态改變時發射stateChanged信号,當信号發生改變時觸發自定義的槽函數btnstate()。

對上面三個複選框的控件說明,如下表所示:

Python Qt GUI設計:QPushButton、QRadioButton和QCheckBox按鈕類(基礎篇—12)

執行個體化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_())      

文章知識點與官方知識檔案比對,可進一步學習相關知識