GUI界面設計中,按鈕是最常用的觸發執行交互操作的控制項。PyQt中根據不同的使用場景將按鈕分為不同的表現形式。按鈕基類是QAbstractButton。
QAbstractButton提供的狀態
狀態QAbstractButton提供信號
信號常見的按鈕主要有PushButton、RadioButton、CheckBox、ToolButton和CommandLinkButton。
一、PushButton:按鈕控制項
PushButton是PyQt5中最常用的控制項,允許用戶通過單擊來執行操作。可以顯示文本,也可以顯圖像,通常通過文本來描述執行的動作。
QPushButton類常用方法
方法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("G:/Projectfile/image/two.ico")))
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_())
二、RadioButton:單選按鈕控制項
RadioButton是單選按鈕控制項,提供一組可供選擇的按鈕和文本標籤,當用戶選擇某單選按鈕時,同一組的其他按鈕不能同時選定。
QRadioButton類常用方法
方法RadioButton常用信號:clicked和toggled,clicked信號在每次單擊單選按鈕發射,toggled信號則在單選按鈕狀態改變時發射,使用toggled信號監控單選按鈕的選擇狀態。
RadioButton按鈕使用示例#此示例利用Qt Design工具設計界面,邏輯與業務界面分離技術實現
from PyQt5.Qt import *
from ui_demo5 import Ui_Form #調用UI界面類
class Window(QMainWindow):
def __init__(self,parent=None):
super().__init__(parent)
self.ui=Ui_Form() #創建UI對象
self.ui.setupUi(self) #構建UI
self.ui.radioButton.setChecked(True) #設置「個人」單選按鈕默認選中
self.ui.pushButton.clicked.connect(self.login)
self.ui.pushButton_2.clicked.connect(self.logout)
# 為單選按鈕的toggled信號綁定自定義槽函數
self.ui.radioButton.toggled.connect(self.select)
#登錄提示
def login(self):
# 使用information()方法彈出信息提示框
QMessageBox.information(None, "登錄信息", "用戶名:" + self.ui.lineEdit.text() + " 密碼:" + self.ui.lineEdit_2.text(),
QMessageBox.Ok)
#退出
def logout(self):
sys.exit()
# 自定義槽函數,用來判斷用戶登錄身份
def select(self):
if self.ui.radioButton.isChecked(): # 判斷是否為管理員登錄
QMessageBox.information(None, "提示", "您選擇的是 個人 登錄", QMessageBox.Ok)
elif self.ui.radioButton_2.isChecked(): # 判斷是否為普通用戶登錄
QMessageBox.information(None, "提示", "您選擇的是 企業 登錄", QMessageBox.Ok)
if __name__ == '__main__':
import sys
#1、創建一個應用程式對象
app=QApplication(sys.argv)
#2、控制項的操作
#創建控制項
window=Window()
#展示控制項
window.show()
#3、應用程式的執行,進入到消息循環
sys.exit(app.exec_())
#窗口ui界面程序文件ui_demo5.py文件,由demo5.ui通過pyuic5轉換。
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(214, 139)
self.layoutWidget = QtWidgets.QWidget(Form)
self.layoutWidget.setGeometry(QtCore.QRect(20, 10, 181, 48))
self.layoutWidget.setObjectName("layoutWidget")
self.formLayout_2 = QtWidgets.QFormLayout(self.layoutWidget)
self.formLayout_2.setContentsMargins(0, 0, 0, 0)
self.formLayout_2.setObjectName("formLayout_2")
self.label = QtWidgets.QLabel(self.layoutWidget)
self.label.setObjectName("label")
self.formLayout_2.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label)
self.lineEdit = QtWidgets.QLineEdit(self.layoutWidget)
self.lineEdit.setObjectName("lineEdit")
self.formLayout_2.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.lineEdit)
self.label_2 = QtWidgets.QLabel(self.layoutWidget)
self.label_2.setObjectName("label_2")
self.formLayout_2.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.label_2)
self.lineEdit_2 = QtWidgets.QLineEdit(self.layoutWidget)
self.lineEdit_2.setObjectName("lineEdit_2")
self.formLayout_2.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.lineEdit_2)
self.layoutWidget_2 = QtWidgets.QWidget(Form)
self.layoutWidget_2.setGeometry(QtCore.QRect(20, 70, 181, 51))
self.layoutWidget_2.setObjectName("layoutWidget_2")
self.gridLayout_3 = QtWidgets.QGridLayout(self.layoutWidget_2)
self.gridLayout_3.setContentsMargins(0, 0, 0, 0)
self.gridLayout_3.setObjectName("gridLayout_3")
self.pushButton_2 = QtWidgets.QPushButton(self.layoutWidget_2)
self.pushButton_2.setObjectName("pushButton_2")
self.gridLayout_3.addWidget(self.pushButton_2, 1, 2, 1, 1)
self.radioButton_2 = QtWidgets.QRadioButton(self.layoutWidget_2)
self.radioButton_2.setObjectName("radioButton_2")
self.gridLayout_3.addWidget(self.radioButton_2, 0, 2, 1, 1)
self.radioButton = QtWidgets.QRadioButton(self.layoutWidget_2)
self.radioButton.setObjectName("radioButton")
self.gridLayout_3.addWidget(self.radioButton, 0, 0, 1, 1)
self.pushButton = QtWidgets.QPushButton(self.layoutWidget_2)
self.pushButton.setObjectName("pushButton")
self.gridLayout_3.addWidget(self.pushButton, 1, 0, 1, 1)
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.gridLayout_3.addItem(spacerItem, 0, 1, 1, 1)
spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.gridLayout_3.addItem(spacerItem1, 1, 1, 1, 1)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "系統登錄界面"))
self.label.setText(_translate("Form", "用戶名:"))
self.label_2.setText(_translate("Form", "密 碼:"))
self.pushButton_2.setText(_translate("Form", "退出"))
self.radioButton_2.setText(_translate("Form", "企業"))
self.radioButton.setText(_translate("Form", "個人"))
self.pushButton.setText(_translate("Form", "登錄"))
三、CheckBox:複選框按鈕
CheckBox提供一組帶文本標籤的複選框,可以選擇多個選項,複選框提供「多選多」的選擇。
連接信號stateChabged,只要複選框被選中或者取消選中,都會發射一個stateChabged信號,可以使用isChecked()來查詢複選框是否被選中。
另外,它除了為用戶提供選中和未選中狀態,還提供第三種狀態:半選中。如果需要第三種狀態,則通過setTristate()來使它生效,並使用checkState()來查詢當前的切換狀態。
QCheckBox類常用方法
方法三種狀態
說明
Qt.Checked
組件沒有被選中(值2)Qt.PartiallyChecked組件被半選中(值1)Qt.Unchecked組件被選中(值0)CheckBox按鈕使用示例# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(211, 139)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.checkBox = QtWidgets.QCheckBox(self.centralwidget)
self.checkBox.setGeometry(QtCore.QRect(22, 19, 101, 16))
self.checkBox.setObjectName("checkBox")
self.checkBox_2 = QtWidgets.QCheckBox(self.centralwidget)
self.checkBox_2.setGeometry(QtCore.QRect(122, 19, 101, 16))
self.checkBox_2.setObjectName("checkBox_2")
self.checkBox_3 = QtWidgets.QCheckBox(self.centralwidget)
self.checkBox_3.setGeometry(QtCore.QRect(22, 49, 101, 16))
self.checkBox_3.setObjectName("checkBox_3")
self.checkBox_4 = QtWidgets.QCheckBox(self.centralwidget)
self.checkBox_4.setGeometry(QtCore.QRect(122, 49, 101, 16))
self.checkBox_4.setObjectName("checkBox_4")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(120, 106, 75, 23))
self.pushButton.setObjectName("pushButton")
MainWindow.setCentralWidget(self.centralwidget)
self.pushButton.clicked.connect(self.getvalue)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "設置用戶權限"))
self.checkBox.setText(_translate("MainWindow", "權限1"))
self.checkBox_2.setText(_translate("MainWindow", "權限2"))
self.checkBox_3.setText(_translate("MainWindow", "權限3"))
self.checkBox_4.setText(_translate("MainWindow", "權限4"))
self.pushButton.setText(_translate("MainWindow", "設置"))
def getvalue(self):
oper="" # 記錄用戶權限
if self.checkBox.isChecked(): # 判斷複選框是否選中
oper+=self.checkBox.text() # 記錄選中的權限
if self.checkBox_2.isChecked():
oper +='\n'+ self.checkBox_2.text()
if self.checkBox_3.isChecked():
oper+='\n'+ self.checkBox_3.text()
if self.checkBox_4.isChecked():
oper+='\n'+ self.checkBox_4.text()
from PyQt5.QtWidgets import QMessageBox
# 使用information()方法彈出信息提示,顯示所有選擇的權限
QMessageBox.information(MainWindow, "提示", "您選擇的權限如下:\n"+oper, QMessageBox.Ok)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow() # 創建窗體對象
ui = Ui_MainWindow() # 創建UI窗體對象
ui.setupUi(MainWindow) # 調用PyQt窗體的方法對窗體對象進行初始化設置
MainWindow.show() # 顯示窗體
sys.exit(app.exec_())
四、ToolButton:工具控制項
ToolButton控制項是一個工具按鈕,再按鈕中提供默認文本"..."和可選的箭頭類型。
使用方法與PushButton類似,ToolButton控制項可以setToolButtonStyle()方法設置工具按鈕的顯示樣式。
1、Qt.ToolButtonIconOnly:只顯示圖標
2、Qt.ToolButtonTextOnly:只顯示文本
3、Qt.ToolButtonTextBesideIcon:文本顯示在圖標旁邊
4、Qt.ToolButtonTextUnderIcon:文本顯示在圖標下面
5、Qt.ToolButtonFollowStyle:跟隨系統樣式
setArrowType()方法設置箭頭類類型。
1、Qt.NoArrow:沒有箭頭
2、Qt.UpArrow:向上的箭頭
3、Qt.DownArrow:向下的箭頭
4、Qt.LeftArrow:向左的箭頭
5、Qt.RightArrow:向右的箭頭
self.toolButton.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon) #設置顯示樣式
self.toolButton.setArrowType(QtCore.Qt.UpArrow) #設置箭頭類型
self.toolButton.setIconSize(QtCore.QSize(32,32)) #設置圖標大小,默認16*16
五、CommandLinkButton:命令連結按鈕
CommandLinkButton控制項是命令連結按鈕,與PushButton類似,區別在該按鈕自定義一個向右的箭頭圖標。顯示為超連結效果。