GUI界面设计中,按钮是最常用的触发执行交互操作的控件。PyQt中根据不同的使用场景将按钮分为不同的表现形式。按钮基类是QAbstractButton。
QAbstractButton提供的状态
状态 | 含义 |
isDown() | 提示按钮是否被按下 |
isChecked() | 提示按钮是否已经标记 |
isEnable() | 提示按钮是否可以被用户点击 |
isCheckAble() | 提示按钮是否为可标记的 |
setAutoRepeat() | 设置按钮是否用户长按时可以自动重复执行 |
QAbstractButton提供信号
信号 | 含义 |
Pressed | 鼠标指针在按钮上按下左键时触发该信号 |
Released | 鼠标左键被释放时触发该信号 |
Clicked | 当鼠标左键被按下然后释放时 |
Toggled | 当按钮的标记状态发生改变时触发该信号 |
常见的按钮主要有PushButton、RadioButton、CheckBox、ToolButton和CommandLinkButton。
一、PushButton:按钮控件
PushButton是PyQt5中最常用的控件,允许用户通过单击来执行操作。可以显示文本,也可以显图像,通常通过文本来描述执行的动作。
QPushButton类常用方法
方法 | 说明 |
setCheckable() | 设置按钮是否已经被选中 |
toggle() | 在按钮状态之间进行切换 |
setIcon() | 设置按钮图标 |
setEnabled() | 设置按钮是否可以使用 |
isChecked() | 返回按钮的状态,True或False |
setDefault() | 设置按钮的默认状态 |
setText() | 设置按钮的显示文本 |
text() | 获取按钮所显示文本 |
setShortcut() | 设置按钮快捷键,参数可以为键盘中的按键或组合如(Alt+F) |
PushButton按钮使用示例
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类常用方法
方法 | 说明 |
setText() | 设置单选按钮显示文本 |
text() | 获取单选按钮显示的文本 |
setChecked()或stCheckable() | 设置单选按钮是否为选中状态 |
isChecked() | 返回单选按钮状态 |
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类常用方法
方法 | 说明 |
setChecked() | 设置复选框状态 |
setText() | 显示文本 |
text() | 返回文本 |
isChecked() | 检查复选框是否被选中 |
setTriState() | 设置复选框为一个三态复选框 |
三种状态
名称 | 说明 |
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类似,区别在该按钮自定义一个向右的箭头图标。显示为超链接效果。