pyqt5中常用的按鈕類控件有QPushButton、QRadioButton、QCheckBox、QToolButton等。這些按鈕類的基類都是QAbstracButton類。所以這些類有部分方法是相同的。
通用的方法有
方法 | 描述 |
isDown() | 判斷按鈕是否按下 |
isChecked() | 返回布爾值,判斷按鈕是否標記,該方法與setChecAble()聯合使用 |
isEnabled() | 設置按鈕是否禁用。禁用時按鈕為灰色,參數為布爾值。注意這個單詞的寫法,網上有些教程錯誤的少寫了一個d |
isCheckAble() | 設置按鈕是否可標記,參數為布爾值 |
setAutoRepeat() | 參數為True時,該按鈕可以長時間被按鈕,連續執行槽函數 |
一、QpushButton

1 import sys,os 2 from PyQt5.QtWidgets import QWidget,QPushButton,QApplication,QVBoxLayout,QHBoxLayout 3 from PyQt5.QtGui import QIcon,QPixmap 4 5 path = os.path.dirname(os.path.dirname(os.path.dirname(__file__))) 6 7 class MyWindow(QWidget): 8 9 def __init__(self): 10 super().__init__() 11 self.initUI() 12 13 def initUI(self): 14 self.setWindowTitle('PushButton示例') 15 self.setWindowIcon(QIcon(r'%s\4.圖標素材\chuan.ico' % path)) 16 self.setGeometry(600,300,450,300) 17 18 self.btn1 = QPushButton('按鍵一') 19 self.btn1.setCheckable(True) #默認為False。這是為True時,按鈕會保持按下狀態 20 self.btn1.clicked.connect(lambda:self.btnstate(self.btn1)) 21 22 self.btn2 = QPushButton('按鍵二') 23 self.btn2.setIcon(QIcon(QPixmap(r'%s\4.圖標素材\python.jpg' % path))) #設置按鈕的圖標 24 self.btn2.clicked.connect(lambda:self.btnstate(self.btn2)) 25 26 self.btn3 = QPushButton('Disabled') 27 self.btn3.clicked.connect(lambda:self.btnsetdisabled(self.btn2)) 28 self.btn3.isEnabled() 29 self.btn3.clicked.connect(lambda:self.btnstate(self.btn3)) 30 31 self.btn4 = QPushButton('按鍵四') 32 self.btn4.setCheckable(True) 33 self.btn4.clicked.connect(lambda:self.btnstate(self.btn4)) 34 35 vbx = QVBoxLayout() 36 vbx.addWidget(self.btn1) 37 vbx.addWidget(self.btn2) 38 vbx.addWidget(self.btn3) 39 vbx.addWidget(self.btn4) 40 41 hbx = QHBoxLayout() 42 hbx.addStretch(1) 43 hbx.addLayout(vbx) 44 hbx.addStretch(1) 45 self.setLayout(hbx) 46 47 def btnstate(self,btn): 48 if btn.isChecked(): 49 print(btn.text()+'被按下') 50 else: 51 print(btn.text()+'沒有按下') 52 53 def btnsetdisabled(self,btn): 54 if btn.isEnabled(): 55 btn.setEnabled(False) 56 else: 57 btn.setEnabled(True) 58 59 60 if __name__ == '__main__': 61 app = QApplication(sys.argv) 62 win = MyWindow() 63 win.show() 64 sys.exit(app.exec_())
效果圖如下:
具體效果不再詳述。
二、QRadIoButton
QRadIoButton是一中單選按鈕,只有checked和unchecked兩個狀態,信號也是再切換單選按鈕(開/關)時發射的。單選常用於“多選一”的場景,也就是說它默認是獨占的。對於繼承同一個弗雷QWidget的多個單選按鈕,他們屬於同一個按鈕組合,用戶最多只能選擇其中一個。如果在同一個父組件下要用到多個獨占的按鈕組合,則需要將他們放在QGroupBox或QButtonBox中。而在實際中,一般只有狀態改變時才會響應信號,所以常用於狀態監控。

1 import sys,os 2 from PyQt5.QtWidgets import QWidget,QRadioButton,QApplication,QVBoxLayout,QHBoxLayout,QGroupBox,QLabel,QLineEdit 3 from PyQt5.QtGui import QIcon,QPixmap 4 5 path = os.path.dirname(os.path.dirname(os.path.dirname(__file__))) 6 7 class MyWindow(QWidget): 8 9 def __init__(self): 10 super().__init__() 11 self.initUI() 12 13 def initUI(self): 14 self.setWindowTitle('QRadioButton示例') 15 self.setWindowIcon(QIcon(r'%s\4.圖標素材\chuan.ico' % path)) 16 self.setGeometry(600,300,400,150) 17 18 rbtn1 = QRadioButton('男',self) 19 rbtn1.move(20,20) 20 rbtn1.toggled.connect(lambda:self.getsex(rbtn1)) 21 rbtn2 = QRadioButton('女',self) 22 rbtn2.move(20,50) 23 rbtn2.toggled.connect(lambda: self.getsex(rbtn2)) 24 25 lbl = QLabel('您的性別是:',self) 26 lbl.move(150,20) 27 self.lineEdit = QLineEdit(self) 28 self.lineEdit.move(150,50) 29 30 def getsex(self,rbtn): 31 sender = self.sender() 32 self.lineEdit.setText(sender.text()) 33 34 35 if __name__ == '__main__': 36 app = QApplication(sys.argv) 37 win = MyWindow() 38 win.show() 39 sys.exit(app.exec_())
效果圖如下:
self.sender()返回的是信號發射到對象,text()則返回文本信息
三、QCheckBox
QCheckBox即帶有標簽的復選框,它同樣具有兩種狀態的控件:開和關。復選框通常用於表示應用程序可以啟用或禁用的功能,和單選框不同之處在於可以“多選”

1 import sys,os 2 from PyQt5.QtWidgets import QWidget,QCheckBox,QApplication,QGridLayout,QLabel,QLineEdit 3 from PyQt5.QtGui import QIcon 4 5 path = os.path.dirname(os.path.dirname(os.path.dirname(__file__))) 6 Items=[] 7 8 class MyWindow(QWidget): 9 10 def __init__(self): 11 super().__init__() 12 self.initUI() 13 14 def initUI(self): 15 self.setWindowTitle('QCheckBox示例') 16 self.setWindowIcon(QIcon(r'%s\4.圖標素材\chuan.ico' % path)) 17 self.setGeometry(600,300,350,300) 18 19 cb1 = QCheckBox('挖掘機') 20 cb2 = QCheckBox('平地機') 21 cb3 = QCheckBox('裝載機') 22 cb4 = QCheckBox('振動碾') 23 lb1 = QLabel('選擇是:') 24 self.lineEdit = QLineEdit() 25 26 grid = QGridLayout() 27 grid.addWidget(cb1,1,1,1,1) 28 grid.addWidget(cb2,1,2,1,1) 29 grid.addWidget(cb3,2,1,1,1) 30 grid.addWidget(cb4,2,2,1,1) 31 grid.addWidget(lb1,3,1,1,1) 32 grid.addWidget(self.lineEdit,3,2,1,1) 33 self.setLayout(grid) 34 35 cb1.stateChanged.connect(lambda:self.chooseItem(cb1)) 36 cb2.stateChanged.connect(lambda: self.chooseItem(cb2)) 37 cb3.stateChanged.connect(lambda: self.chooseItem(cb3)) 38 cb4.stateChanged.connect(lambda: self.chooseItem(cb4)) 39 40 def chooseItem(self,cb): 41 if cb.isChecked(): 42 if cb.text() not in Items: 43 Items.append(cb.text()) 44 shop_cart = ','.join(Items) 45 self.lineEdit.setText(shop_cart) 46 else: 47 if cb.text() in Items: 48 Items.remove(cb.text()) 49 shop_cart = ','.join(Items) 50 self.lineEdit.setText(shop_cart) 51 52 if __name__ == '__main__': 53 app = QApplication(sys.argv) 54 win = MyWindow() 55 win.show() 56 sys.exit(app.exec_())
效果圖如下: