Python Qt GUI设计:QPushButton、QRadioButton和QCheckBox按钮类(基础篇—12)
目錄
1、QPushButton按鈕類
2、QRadioButton按鈕類
3、QCheckBox按鈕類
在GUI設計中,按鈕都是最重要的和常用的觸發(fā)動作請求的方式,用來與用戶進行交互操作。在PyQt中根據(jù)不同的使用場景將按鈕劃分為不同的表現(xiàn)形式。
按鈕的基類是QAbstractButton,提供了按鈕的通用性功能。但是它不能實例化,必須由其他的按鈕類繼承QAbstractButton類,來實現(xiàn)不同的功能、不同的表現(xiàn)形式。
常見的按鈕類包括:QPushButton、QRadioButton和QCheckBox等。這些按鈕類均繼承自QAbstractButton類,根據(jù)各自的使用場景通過圖形展現(xiàn)出來。
QAbstractButton提供的狀態(tài)如下表所示:
QAbstractButton提供的信號如下表所示:?
1、QPushButton按鈕類
QPushButton類繼承自QAbstractButton類,其形狀是長方形,文本標題或圖標可以顯示在長方形上。
QPushButton類是一種命令按鈕,可以單擊該按鈕執(zhí)行一些命令,或者響應一些事件,常見的有:“確認"、"申請"、"取消"、"關(guān)閉"、"是"、"否"等按鈕。
QPushButton類中的常用方法如下表所示:
來看看QPushButton按鈕類的示例,效果如下所示:
在這個例子中,創(chuàng)建了btn1、btn2、btn3和btn4四個按鈕,這四個QPushButton對象被定義為類的實例變量。每個按鈕都將clicked信號發(fā)送給指定的槽函數(shù),以響應按鈕點擊事件。
- 第1個按鈕btn1,通過toggle()函數(shù)來切換按鈕狀態(tài)。當點擊這個按鈕時,將clicked信號發(fā)送給槽函數(shù)btnstate(),通過btn.isChecked來獲得按鈕是否被點擊或釋放的狀態(tài)。還可以通過lambda的方式來傳遞額外的參數(shù)btn1,將clicked信號發(fā)送給槽函數(shù)whichbtn()。
- 第2個按鈕btn2,上面顯示一個圖標。使用setlcon()方法接收一個QPixmap對象的圖像文件作為輸入?yún)?shù)。
- 第3個按鈕btn3,使用setEnabled()方法來禁用bnt3按鈕。
- 第4個按鈕btn4,使用setDefault()方法來設置按鈕的默認狀態(tài)。快捷鍵是“&+文本”(&Download),通過“Alt+D”快捷鍵來調(diào)用槽函數(shù)。
實現(xiàn)代碼如下所示:
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_())
2、QRadioButton按鈕類
QRadioButton類提供了一組可供選擇的按鈕和文本標簽,用戶可以選擇其中一個選項,標簽用于顯示對應的文本信息。單選鈕是一種開關(guān)按鈕,可以切換為on或者off,即checked或者unchecked,主要是為用戶提供"多選一"的選擇。
QRadioButton是單選鈕控件默認是獨占的(Exclusive)。對于繼承自同一個父類Widget的多個單選鈕,它們屬于同一個按鈕組合,在單選鈕組里,一次只能選擇一個單選鈕。如果需要多個獨占的按鈕組合,則需要將它們放在QGroupBox或QButtonGroup中。
QRadioButton類中的常用方法如下表所示:
在QRadioButton中,toggled信號是在切換單選鈕狀態(tài)(開、關(guān))時發(fā)射的,而clicked信號則在每次點擊單選鈕時都會發(fā)射。在實際中,一般只有狀態(tài)改變時才有必要去響應,因此toggled信號更適合用于狀態(tài)監(jiān)控。
來看看QRadioButton按鈕類的示例,效果如下所示:
在這個例子中,兩個互斥的單選鈕被放置在窗口中。
第1個單選鈕btn1,被設置成默認選中狀態(tài)。
self.btn1.setChecked(True)
當選擇兩個按鈕相互切換時,按鈕的狀態(tài)發(fā)生改變,將觸發(fā)toggle信號,并與槽函數(shù)btnstate()連接。使用lambda的方式允許將源信號傳遞給槽函數(shù),將按鈕作為參數(shù)。
self.btn1.toggled.connect(lambda:self.btnstate(self.btn1))
self.btn2.toggled.connect(lambda:self.btnstate(self.btn2))
當發(fā)射toggled信號后,使用btnstate()函數(shù)來檢查按鈕的狀態(tài)。
實現(xiàn)代碼如下所示:
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_())
3、QCheckBox按鈕類
QCheckBox類提供了一組帶文本標簽的復選框,用戶可以選擇多個選項。和QPushButton一樣,復選框可以顯示文本或者圖標,其中文本可以通過構(gòu)造函數(shù)或者setText()來設置;圖標可以通過setlcon()來設置。在視覺上,QButtonGroup可以把許多復選框組織在一起。
QCheckBox(復選框)和QRadioButton(單選鈕)都是選項按鈕,因為它們都可以在開(選中)或者關(guān)(未選中)之間切換。它們的區(qū)別是對用戶選擇的限制:單選鈕提供了“多選一"的選擇;而復選框提供的是“多選多"的選擇。
QCheckBox通常被應用在需要用戶選擇一個或多個可用的選項的場景中。
只要復選框被選中或者取消選中,都會發(fā)射一個stateChanged 信號。如果想在復選框狀態(tài)改變時觸發(fā)相應的行為,請連接這個信號,可以使用isChecked()來查詢復選框是否被選中。
除了常用的選中和未選中兩種狀態(tài),QCheckBox還提供了第三種狀態(tài)(半選中)來表明“沒有變化"。當需要為用戶提供一個選中或者未選中復選框的選擇時,這種狀態(tài)是很有用的。如果需要第三種狀態(tài),則可以通過setTristate()來使它生效,并使用checkState()來查詢當前的切換狀態(tài)。
QCheckBox類中的常用方法如下表所示:
三態(tài)復選框有三種狀態(tài),如下表所示:
來看看QCheckBox按鈕類的示例,效果如下所示:
在這個例子中,將三個復選框添加到一個水平布局管理器中,并添加到一個QGroupBox組中。
將三個復選框的stateChanged信號都連接到槽函數(shù)stateChanged()。使用lambda的方式傳遞對象給槽函數(shù)。當QCheckBox狀態(tài)改變時發(fā)射stateChanged信號,當信號發(fā)生改變時觸發(fā)自定義的槽函數(shù)btnstate()。
對上面三個復選框的控件說明,如下表所示:
實例化checkBox1和checkBox2兩個對象,并將checkBox1的狀態(tài)設置為選中,為checkBox1設置快捷鍵,使用“&"符號,如“&Checkbox 1",則通過“Alt+C"快捷鍵可以選中checkBox1復選框。
實例化一個QCheckBox類對象checkBox3,然后使用setTristate()開啟三態(tài)模式。
實現(xiàn)代碼如下所示:
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qtclass 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_())
總結(jié)
以上是生活随笔為你收集整理的Python Qt GUI设计:QPushButton、QRadioButton和QCheckBox按钮类(基础篇—12)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python Qt GUI设计:QMai
- 下一篇: Python Qt GUI设计:QLin