按钮类控件主要用来执行一些命令操作,PyQt5中的按钮类控件主要有PushButtonToolButtonCommandLinkButtonRadioButton和CheckBox等,本节将对它们的常用方法及使用方式进行讲解。

1  PushButton:按钮


PushButton是PyQt5中最常用的控件之一,它被称为按钮控件,允许用户通过单击来执行操作。PushButton控件既可以显示文本,也可以显示图像。当该控件被单击时,它看起来的状态像是被按下,然后被释放。

PushButton控件对应PyQt5中的QPushButton类,该类的常用方法及说明如表所示。

方    法说    明
setText()设置按钮所显示的文本
text()获取按钮所显示的文本
setIcon()设置按钮上的图标,可以将参数设置为QtGui.QIcon('图标路径')
setIconSize()设置按钮图标的大小,参数可以设置为QtCore.QSize(int width,int height)
setEnabled()设置按钮是否可用,参数设置为False时,按钮为不可用状态
setShortcut()设置按钮的快捷键,参数可以设置为键盘中的按键或组合键例如<Alt+0>

PushButton按钮中最常用的信号是clicked,当按钮被单击时,会发射该信号执行相应的操作。

实例 制作登录窗口

为系统登录窗口添加登录退出按钮,当单击登录按钮时,弹出用户输入的用户名和密码;而当单击退出按钮时,则关闭当前登录窗口。代码如下:

from PyQt5 import QtCore, QtGui, QtWidgets  
from PyQt5.QtGui import QPixmap, QIcon  
  
class Ui_MainWindow(object):  
    def setupUi(self, MainWindow):  
        MainWindow.setObjectName("MainWindow")  
        MainWindow.resize(225, 121)  
        self.centralwidget = QtWidgets.QWidget(MainWindow)  
        self.centralwidget.setObjectName("centralwidget")  
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)  
        self.pushButton.setGeometry(QtCore.QRect(40, 83, 61, 23))  
        self.pushButton.setObjectName("pushButton")  
        self.pushButton.setIcon(QIcon(QPixmap("login.ico")))  # 为“登录”按钮设置图标  
        self.label = QtWidgets.QLabel(self.centralwidget)  
        self.label.setGeometry(QtCore.QRect(29, 22, 54, 12))  
        self.label.setObjectName("label")  
        self.label_2 = QtWidgets.QLabel(self.centralwidget)  
        self.label_2.setGeometry(QtCore.QRect(29, 52, 54, 12))  
        self.label_2.setObjectName("label_2")  
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)  
        self.lineEdit.setGeometry(QtCore.QRect(79, 18, 113, 20))  
        self.lineEdit.setObjectName("lineEdit")  
        self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)  
        self.lineEdit_2.setGeometry(QtCore.QRect(78, 50, 113, 20))  
        self.lineEdit_2.setObjectName("lineEdit_2")  
        self.lineEdit_2.setEchoMode(QtWidgets.QLineEdit.Password)  # 设置文本框为密码  
        # 设置只能输入8位数字  
        self.lineEdit_2.setValidator(QtGui.QIntValidator(10000000, 99999999))  
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)  
        self.pushButton_2.setGeometry(QtCore.QRect(120, 83, 61, 23))  
        self.pushButton_2.setObjectName("pushButton_2")  
        self.pushButton_2.setIcon(QIcon(QPixmap("exit.ico")))  # 为“退出”按钮设置图标  
        MainWindow.setCentralWidget(self.centralwidget)  
        self.retranslateUi(MainWindow)  
        # 为“登录”按钮的clicked信号绑定自定义槽函数  
        self.pushButton.clicked.connect(self.login)  
        # 为“退出”按钮的clicked信号绑定MainWindow窗口自带的close()槽函数  
        self.pushButton_2.clicked.connect(MainWindow.close)  
        QtCore.QMetaObject.connectSlotsByName(MainWindow)  
    def login(self):  
        from PyQt5.QtWidgets import QMessageBox  
        # 使用information()方法弹出信息提示框  
        QMessageBox.information(MainWindow, "登录信息",  
                                "用户名:" + self.lineEdit.text() + "  密码:" + self.lineEdit_2.text(), QMessageBox.Ok)  
    def retranslateUi(self, MainWindow):  
        _translate = QtCore.QCoreApplication.translate  
        MainWindow.setWindowTitle(_translate("MainWindow", "系统登录"))  
        self.pushButton.setText(_translate("MainWindow", "登录"))  
        self.label.setText(_translate("MainWindow", "用户名:"))  
        self.label_2.setText(_translate("MainWindow", "密  码:"))  
        self.pushButton_2.setText(_translate("MainWindow", "退出"))  
import sys  
# 程序入口,程序从此处启动PyQt设计的窗体  
if __name__ == '__main__':  
    app = QtWidgets.QApplication(sys.argv)  
    MainWindow = QtWidgets.QMainWindow()  # 创建窗体对象  
    ui = Ui_MainWindow()  # 创建PyQt设计的窗体对象  
    ui.setupUi(MainWindow)  # 调用PyQt窗体的方法对窗体对象进行初始化设置  
    MainWindow.show()  # 显示窗体  
    sys.exit(app.exec_())  # 程序关闭时退出进程

Info: 说明 上面代码中为登录按钮和退出按钮设置图标时,用到了两个图标文件login.icoexit.ico,这里需要提前准备好这两个图标文件,并将它们复制到与.py文件的同级目录下。

运行程序,输入用户名和密码,单击登录按钮,可以在弹出的提示框中显示输入的用户名和密码,如图所示,而单击退出按钮,可以直接关闭当前窗口。

Pasted image 20250829091956

Tip: 多学两招 如果想为PushButton按钮设置快捷键,可以在创建对象时指定其文本,并在文本中添加&符号,这样,&符号后面的第一个字母默认就会作为快捷键,例如在上面的实例中,为登录按钮设置快捷键,则可以将创建登录按钮的代码修改如下:

self.pushButton = QtWidgets.QPushButton("登录(&D)",self.centralwidget)

修改完成之后,按键盘上的`Alt+D`组合键,即可执行与单击`登录`按钮相同的操作。

2  ToolButton:工具按钮


ToolButton控件是一个工具按钮,它本质上是一个按钮,只是在按钮中提供了默认文本和可选的箭头类型,它对应PyQt5中的QToolButton类。

ToolButton控件的使用方法与PushButton类似,不同的是,ToolButton控件可以设置工具按钮的显示样式和箭头类型。其中,工具按钮的显示样式通过QToolButton类的setToolButtonStyle()方法进行设置,主要支持以下5种样式:

  • Qt.ToolButtonIconOnly:只显示图标。
  • Qt.ToolButtonTextOnly:只显示文本。
  • Qt.ToolButtonTextBesideIcon:文本显示在图标的旁边。
  • Qt.ToolButtonTextUnderIcon:文本显示在图标的下面。
  • Qt.ToolButtonFollowStyle:跟随系统样式。

工具按钮的箭头类型通过QToolButton类的setArrowType()方法进行设置,主要支持以下5种箭头类型:

  • Qt.NoArrow:没有箭头。
  • Qt.UpArrow:向上的箭头。
  • Qt.DownArrow:向下的箭头。
  • Qt.LeftArrow:向左的箭头。
  • Qt.RightArrow:向右的箭头。

实例 设计一个向上箭头的工具按钮

本实例用来对名称为ToolButton的工具按钮进行设置,设置其箭头类型为向上箭头,并且文本显示在箭头的下面,代码如下:

self.toolButton.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon) # 设置显示样式
self.toolButton.setArrowType(QtCore.Qt.UpArrow) # 设置箭头类型

运行效果如图所示。

Pasted image 20250829094305

Tip: 多学两招 ToolButton控件中的箭头图标默认大小为16×16,如果想改变箭头图标的大小,可以使用setIconSize()方法,例如,下面代码可以将ToolButton按钮的箭头图标大小修改为32×32

self.toolButton.setIconSize(QtCore.QSize(32, 32)) # 设置图标大小

3  CommandLinkButton:命令链接按钮


CommandLinkButton控件是一个命令链接按钮,它对应PyQt5中的QCommandLinkButton类,该类与PushButton按钮的用法类似,区别是,该按钮自定义一个向右的箭头图标。

实例 使用命令链接按钮

使用Qt Designer设计器创建一个MainWindow窗口,其中添加一个CommandLinkButton控件,并设置其文本为https://www.github.com/Couioly,运行程序,默认效果如图所示,当将鼠标移动到按钮上时,显示为超链接效果,如图所示。

  • CommandLinkButton控件的默认效果

Pasted image 20250829095507

  • 鼠标移动到CommandLinkButton按钮上的效果

Pasted image 20250829095441

4  RadioButton:单选按钮


RadioButton是单选按钮控件,它为用户提供由两个或多个互斥选项组成的选项集,当用户选中某单选按钮时,同一组中的其他单选按钮不能同时选定。

RadioButton控件对应PyQt5中的QRadioButton类,该类的常用方法及说明如表所示。

方    法说    明
setText()设置单选按钮显示的文本
text()获取单选按钮显示的文本
setChecked()或者setCheckable()设置单选按钮是否为选中状态,True为选中状态;False为未选中状态
isChecked()返回单选按钮的状态,True为选中状态;False为未选中状态

RadioButton控件常用的信号有两个:clickedtoggled,其中,clicked信号在每次单击单选按钮时都会发射;而toggled信号则在单选按钮的状态改变时才会发射。因此通常使用toggled信号监控单选按钮的选择状态。

实例 选择用户登录角色

在窗口中添加两个RadioButton控件,用来选择管理员登录和普通用户登录,它们的文本分别设置为管理员普通用户,然后定义一个select()槽函数,用来判断管理员单选按钮和普通用户单选按钮分别选中时的弹出信息,最后将管理员单选按钮的toggled信号与自定义的select()槽函数关联。代码如下:

from PyQt5 import QtCore, QtGui, QtWidgets  
from PyQt5.QtWidgets import QMessageBox  
  
  
class Ui_MainWindow(object):  
    def setupUi(self, MainWindow):  
        MainWindow.setObjectName("MainWindow")  
        MainWindow.resize(215, 128)  
        self.centralwidget = QtWidgets.QWidget(MainWindow)  
        self.centralwidget.setObjectName("centralwidget")  
        self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)  
        self.lineEdit_2.setGeometry(QtCore.QRect(75, 44, 113, 20))  
        self.lineEdit_2.setObjectName("lineEdit_2")  
        self.lineEdit_2.setEchoMode(QtWidgets.QLineEdit.Password)  # 设置文本框为密码  
        # 设置只能输入8位数字  
        self.lineEdit_2.setValidator(QtGui.QIntValidator(10000000, 99999999))  
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)  
        self.pushButton_2.setGeometry(QtCore.QRect(113, 97, 61, 23))  
        self.pushButton_2.setObjectName("pushButton_2")  
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)  
        self.lineEdit.setGeometry(QtCore.QRect(76, 12, 113, 20))  
        self.lineEdit.setObjectName("lineEdit")  
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)  
        self.pushButton.setGeometry(QtCore.QRect(33, 97, 61, 23))  
        self.pushButton.setObjectName("pushButton")  
        self.label_2 = QtWidgets.QLabel(self.centralwidget)  
        self.label_2.setGeometry(QtCore.QRect(26, 46, 54, 12))  
        self.label_2.setObjectName("label_2")  
        self.label = QtWidgets.QLabel(self.centralwidget)  
        self.label.setGeometry(QtCore.QRect(26, 16, 54, 12))  
        self.label.setObjectName("label")  
        self.radioButton = QtWidgets.QRadioButton(self.centralwidget)  
        self.radioButton.setGeometry(QtCore.QRect(36, 73, 61, 16))  
        self.radioButton.setObjectName("radioButton")  
        self.radioButton.setChecked(True)  # 设置“管理员”单选按钮默认选中  
        self.radioButton_2 = QtWidgets.QRadioButton(self.centralwidget)  
        self.radioButton_2.setGeometry(QtCore.QRect(106, 73, 71, 16))  
        self.radioButton_2.setObjectName("radioButton_2")  
        MainWindow.setCentralWidget(self.centralwidget)  
        self.retranslateUi(MainWindow)  
        # 为“登录”按钮的clicked信号绑定自定义槽函数  
        self.pushButton.clicked.connect(self.login)  
        # 为“退出”按钮的clicked信号绑定MainWindow窗口自带的close槽函数  
        self.pushButton_2.clicked.connect(MainWindow.close)  
        # 为单选按钮的toggled信号绑定自定义槽函数  
        self.radioButton.toggled.connect(self.select)  
        QtCore.QMetaObject.connectSlotsByName(MainWindow)  
  
    def login(self):  
        # 使用information()方法弹出信息提示框  
        QMessageBox.information(MainWindow, "登录信息","用户名:" + self.lineEdit.text() + "  密码:" + self.lineEdit_2.text(), QMessageBox.Ok)  
    # 自定义槽函数,用来判断用户登录身份  
    def select(self):  
        if self.radioButton.isChecked():  # 判断是否为管理员登录  
            QMessageBox.information(MainWindow, "提示", "您选择的是 管理员  登录", QMessageBox.Ok)  
        elif self.radioButton_2.isChecked():  # 判断是否为普通用户登录  
            QMessageBox.information(MainWindow, "提示", "您选择的是 普通用户  登录", QMessageBox.Ok)  
  
    def retranslateUi(self, MainWindow):  
        _translate = QtCore.QCoreApplication.translate  
        MainWindow.setWindowTitle(_translate("MainWindow", "系统登录"))  
        self.pushButton_2.setText(_translate("MainWindow", "重置"))  
        self.pushButton.setText(_translate("MainWindow", "登录"))  
        self.label_2.setText(_translate("MainWindow", "密  码:"))  
        self.label.setText(_translate("MainWindow", "用户名:"))  
        self.radioButton.setText(_translate("MainWindow", "管理员"))  
        self.radioButton_2.setText(_translate("MainWindow", "普通用户"))  
  
import sys  
# 程序入口,程序从此处启动PyQt设计的窗体  
if __name__ == '__main__':  
    app = QtWidgets.QApplication(sys.argv)  
    MainWindow = QtWidgets.QMainWindow()  # 创建窗体对象  
    ui = Ui_MainWindow()  # 创建PyQt设计的窗体对象  
    ui.setupUi(MainWindow)  # 调用PyQt窗体的方法对窗体对象进行初始化设置  
    MainWindow.show()  # 显示窗体  
    sys.exit(app.exec_())  # 程序关闭时退出进程

运行程序,管理员单选按钮默认处于选中状态,选中普通用户单选按钮,将弹出您选择的是 普通用户 登录提示框,如图所示。

Pasted image 20250829100935

选中管理员单选按钮,将弹出您选择的是 管理员 登录提示框,如图所示。

Pasted image 20250829100853

5  CheckBox:复选框


CheckBox是复选框控件,它用来表示是否选取了某个选项条件,常用于为用户提供具有是/否或真/假值的选项,它对应PyQt5中的QCheckBox类。

CheckBox控件的使用与RadioButton控件类似,但它是为用户提供多选多的选择。另外,它除了选中和未选中两种状态之外,还提供了第三种状态:半选中。如果需要第三种状态,需要使用QCheckBox类setTristate()方法使其生效,并且可以使用checkState()方法查询当前状态。

CheckBox控件的三种状态值及说明如表所示。

方    法说    明
QT.Checked()选中
QT.PartiallyChecked()半选中
QT.Unchecked()未选中

CheckBox控件最常用的信号是stateChanged,用来在复选框的状态发生改变时发射。

实例 设置用户权限

在Qt Designer设计器中创建一个窗口,实现通过复选框的选中状态设置用户权限的功能。在窗口中添加5个CheckBox控件,文本分别设置为基本信息管理、进货管理、销售管理、库存管理、系统管理,主要用来表示要设置的权限;添加一个PushButton控件,用来显示选择权限。设计完成后保存为.ui文件,并使用Pyuic工具将其转换为.py代码文件。在.py代码文件中自定义一个getvalue()方法,用来根据CheckBox控件的选中状态记录相应的权限。代码如下:

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()  
    if self.checkBox_5.isChecked():  
        oper += '\n' + self.checkBox_5.text()  
    from PyQt5.QtWidgets import QMessageBox  
    # 使用information()方法弹出信息提示,显示所有选择的权限  
    QMessageBox.information(MainWindow, "提示", "您选择的权限如下:\n" + oper, QMessageBox.Ok)

设置按钮的clicked信号与自定义的槽函数getvalue()相关联,代码如下:

self.pushButton.clicked.connect(self.getvalue)

.py文件添加程序入口,然后运行程序,选中相应权限的复选框,单击设置按钮,即可在弹出提示框中显示用户选择的权限,如图所示。

Pasted image 20250829102454

Tip: 多学两招 在设计用户权限或者考试系统中的多选题答案等功能时,可以使用CheckBox控件来实现。