1.QAbractButton
QAbractButton是按鈕控件的基類,承載了按鈕的大部分功能,但是不能進行實例化,必須由其他按鈕來繼承,以實現不同的表現形式
以下是QAbractButton提供的常見狀態與信號
2.QPushButton
QPushButton是命令按鈕的一種,形狀一般爲長方形(可以顯示文本標題或圖標)通過單擊該按鈕可以實現一些命令,或者響應一些事件(”確認“,”申請“,”是“,”否“等等)。通常情況下,我們通過文本來描述執行的動作,也可通過快捷鍵實現對應按鈕的命令
常見方法
若想爲按鈕設計快捷鍵,比如名字爲’&Ok’的按鈕,他的快捷鍵就是’Alt+O’。其規則是:以實現Alt+O爲例,按鈕的名字中必須要有字母O(一般是按鈕的首字母),而且在字母O前面加上&,在按鈕顯示過程中&不會顯示出來,但在字母O下面會出現一個下劃線
實例
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)#設置按鈕是否已經被選中,設置爲True,按鈕保持點擊後釋放狀態
self.btn1.toggle()#由於前面已釋放,故切換狀態在此選中
self.btn1.clicked.connect(lambda:self.whichbtn(self.btn1))#通過lambda方法來傳遞額外的參數
self.btn1.clicked.connect(self.btnstate)
layout.addWidget(self.btn1)
self.btn2 = QPushButton("imageButton")
self.btn2.setIcon(QIcon(QPixmap("./cartoon1.ico")))#注意添加圖片的格式
self.btn2.clicked.connect(lambda: self.whichbtn(self.btn2))
layout.addWidget(self.btn2)
self.btn3=QPushButton("Disabled")
self.btn3.setEnabled(False)#按鈕設爲不可用
layout.addWidget(self.btn3)
self.btn4 = QPushButton("&Ok")#設置快捷方式
self.btn4.setDefault(True)
self.btn4.clicked.connect(lambda: self.whichbtn(self.btn4))
layout.addWidget(self.btn4)
self.setWindowTitle("ButtonDemo")
self.setLayout(layout)
def btnstate(self):
if self.btn1.isCheckable():
print("Pressed")
else:
print("Released")
def whichbtn(self,btn):
print(btn.text()+"is clicked")
if __name__=='__main__':
app=QApplication(sys.argv)
BtnDemo = Form()
BtnDemo.show()
sys.exit(app.exec_())
3.QRadioButton
QRadioBtton提供了一組可供選擇的按鈕和文本標籤,用戶可以選擇其中的一個選項,標籤用於顯示對應的文本信息,單選鈕是一種開關按鈕,有on/off兩種狀態,可爲用戶提供多選一的選擇,在單選鈕組裏一次只能選擇一個,如需選擇多個需要使用QGroupBox或QButtonGroup
當講單選鈕切換到on/off是,就會發送一個toggled信號,綁定該信號,當按鈕狀態發生改變,就會觸發相應的行爲(toggled信號是在切換狀態發射,clicked信號是在每次點擊單選鈕發射,實際使用中,一般只有狀態改變纔有必要響應,故toggled信號更適合狀態監控)。
常用方法
實例
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 = QVBoxLayout()#豎直排列
self.btn1 = QRadioButton("Button1")
self.btn1.setChecked(True)#設置爲默認選中狀態
self.btn1.toggled.connect(lambda:self.btnstate(self.btn1))#檢測按鈕狀態是否被切換 通過lambda方法來傳遞額外的參數
layout.addWidget(self.btn1)
self.btn2 = QRadioButton("imageButton")
self.btn2.setIcon(QIcon(QPixmap("./cartoon1.ico")))#注意添加圖片的格式
self.btn1.toggled.connect(lambda: self.btnstate(self.btn2))
layout.addWidget(self.btn2)
self.setLayout(layout)
self.setWindowTitle("RadioDemo")
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() == 'imageButton':
if btn.isChecked()==True:
print(btn.text()+ " is selected")
else:
print(btn.text()+" is deselected")
if __name__=='__main__':
app=QApplication(sys.argv)
BtnDemo = RadioDemo()
BtnDemo.show()
sys.exit(app.exec_())
4.QCheckBox
QCheckBox是一組帶文本標籤的複選框,用戶可以選則多個選項,視覺上也可以通過QButtonGroup將多複選框組合在一起,與單選框的區別是爲用戶提供多對多的選擇。
只要複選框被選中或者取消選中,都會發射一個stateChanged信號。如果想在複選框狀態改變是觸發相應的行爲,可連接這個信號,使用isChecked()來查詢複選框是否被選中。
特別的,除了選中與被選中狀態,QCheckBox還提供了第三種狀態(半選中)表明沒有變化,可以通過setTristate()使之生效,並用CheckState()來查詢當前的切換狀態
常見方法與狀態
實例
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)
#建立一個QGroupBox組,方便複選框加入
groupBox=QGroupBox("CheckBoxes")
groupBox.setFlat(True)
layout = QHBoxLayout()#水平排列
self.CheckBox1 = QCheckBox("&CheckBox1")
self.CheckBox1.setChecked(True)#設置爲默認選中狀態
self.CheckBox1.stateChanged.connect(lambda:self.btnstate(self.CheckBox1))#檢測QCheCheckBo是否改變 通過lambda方法來傳遞額外的參數
layout.addWidget(self.CheckBox1)
self.CheckBox2 = QCheckBox("imageButton")
self.CheckBox2.setIcon(QIcon(QPixmap("./cartoon1.ico")))#注意添加圖片的格式
self.CheckBox2.toggled.connect(lambda: self.btnstate(self.CheckBox2))
layout.addWidget(self.CheckBox2)
self.CheckBox3 = QCheckBox("CheckBox3")
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("CheckBoxDemo")
def btnstate(self,btn):#檢查按鈕狀態
chk1Status = self.CheckBox1.text()+", isChecked="+str(self.CheckBox1.isChecked())+ ',checkState='+str( self.CheckBox1.checkState())+"\n"#檢測複選框是否被選中
#Checked 通過布爾判斷(true & false)而CheckState 通過枚舉判斷 checkstate有三個枚舉屬性Unchecked、Checked、Indeterminate
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)
BtnDemo = CheckBoxDemo()
BtnDemo.show()
sys.exit(app.exec_())