二、核心技术

(一)PyQt5常用控件的使用

      控件是窗口程序的基本组成单位,通过使用控件可以高效地开发窗口应用程序。所以,熟练掌握控件是合理、有效地进行窗口程序开发的重要前提。

1. 控件概述

      控件是用户可以用来输入或操作数据的对象,也就相当于汽车中的方向盘、油门、刹车、离合器等,它们都是对汽车进行操作的控件。在PyQt5中,控件的基类位于QFrame类,而QFrame类继承自QWidget类,QWidget类是所有用户界面对象的基类。

1. 认识控件

      Qt Designer设计器中默认对控件进行了分组。
控件名称说明控件名称说明
Layouts——布局管理
VerticalLayout垂直布局HorizontalLayout水平布局
GridLayout网格布局FormLayout表单布局
Spacers——弹簧
HorizontalSpacer水平弹簧VerticalSpacer垂直弹簧
Buttons——按钮类
PushButton按钮ToolButton工具按钮
RadioButton单选按钮CheckBox复选框
CommandLinkButton命令链接按钮DialogButtonBox对话框按钮盒
Item Views(Model-Based)——项目视图
ListView列表视图TreeView树视图
TableView表格视图ColumnView列视图
UndoView撤销命令显示视图
Item Widgets(Item-Based)——项目控件
ListWidget列表控件TreeWidget树控件
TableWidget表格控件
Containers——容器
GroupBox分组框ScrollArea滚动区域
ToolBox工具箱TabWidget选项卡
StackedWidget堆栈窗口Frame
Widget小部件MDIAreaMDI区域
DockWidget停靠窗口
Input——输入控件
ComboBox下拉组合框FontComboBox字体组合框
LineEdit单行文本框TextEdit多行文本框
PlainTextEdit纯文本编辑框SpinBox数字选择控件
DoubleSpinBox小数选择控件TimeEdit时间编辑控件
DateEdit日期编辑框DateTimeEdit日期时间编辑框
Dial旋钮HorizontalScrollBar横向滚动条
VerticalScrollBar垂直滚动条HorizontalSlider横向滑块
VerticalSlider垂直滑块KeySequenceEdit按键编辑框
Display Widgets——显示控件
Label标签控件TextBrowser文本浏览器
GraphicsView图形视图CalendarWidget日期控件
LCDNumber液晶数字显示ProgressBar进度条
HorizontalLine水平线VerticalLine垂直线
OpenGLWidget开放式图形库工具

2.控件的命名规范

在使用控件的过程中,可以通过控件默认的名称调用。如果自定义控件名称,建议按照下表所示命名规范对控件进行命名。
控件名称命名控件名称命名
LabellabListViewlv
LineEditleditListWidgetlw
TextEditteditTreeViewtv
PlainTextEditpeditTreeWidgettw
TextBrowsertxtTableViewtbv
PushButtonpbtnTableWidgettbw
ToolButtontbtnGroupBoxgbox
CommandLinkButtonlinbtnSpinBoxsbox
RadioButtonrbtnTabWidgettab
CheckBoxckboxTimeEdittime
ComboBoxcboxDateEditdate
......

      注意,控件的命名并不是绝对的,可以根据个人的喜好习惯或企业要求灵活使用。

2. 文本类控件

      文本类控件主要用来显示或者编辑文本信息,PyQt5中的文本类控件主要有Label、LineEdit、TextEdit、SpinBox、DoubleSpinBox、LCDNumber等。

1. Label:标签控件

  • 主要用于显示用户不能编辑的文本,标识窗体上的对象(例如,给文本框、列表框添加描述信息等),它对应PyQt5中的QLabel类,Label控件本质上是QLabel类的一个对象。
    在这里插入图片描述
1. 设置标签文本

      有两种方式设置标签控件显示的文本,第一种是直接在Qt Designer设计器的属性编辑器在那个设置text属性,第二种是通过Python代码设置。

(1)通过Qt Designer的text属性设置

在这里插入图片描述

(2)通过Python代码设置标签控件的显示文本
# 设置标签控件
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(40, 40, 100, 41))
self.label.setText("我是一个标签")

在这里插入图片描述

运行结果:
在这里插入图片描述
      将.ui文件转换为.py文件时,Lable控件所对应的类为QLabel,即在控件前面加了一个“Q”,表示它是Qt的控件,其他控件也是如此。

2. 设置标签文本的对齐方式

      PyQt5中支持设置标签文本的对齐方式,用到alignment属性,在Qt Designer的属性编辑器中展开alignment属性,可以看到有两个值,分别是Horizontal和Vertical,用于设置标签文本水平对齐方式和垂直对齐方式,取值有4个。

Horizontal取值及说明
说明效果图
AlignLeft左对齐
AlignHCenter水平居中对齐
AlignRight右对齐
AlignJustify两端对齐,效果同AlignLeft

在这里插入图片描述

Vertical取值及说明
说明效果图
AlignTop顶部对齐
AlignVCenter垂直居中对齐
AlignBottom底部对齐

      使用代码设置Label标签文本的对齐方式,需要用到QLabel类的setAlignment()方法。例如,将标签文本的对齐方式设置为水平左对齐、垂直居中对齐。

self.label.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)
3. 设置文本换行显示

      假设将标签文本的text值设置为“每天编程1小时,从菜鸟到大牛”,在标签宽度不足的情况下,系统会默认只显示部分文字。
      遇到这种情况,可以设置标签中的文本换行显示,只需要在Qt Designer设计器的属性编辑器中,将wordWrap属性后面的复选框选中即可。
在这里插入图片描述
使用代码设置Label标签文本换行显示,需要用到QLabel类的setWordWrap()方法

self.label.setWordWrap(True)

在这里插入图片描述

运行结果:
在这里插入图片描述

4. 为标签设置超链接

      为Label标签设置超链接时,可以直接在QLabel类的setText()方法中使用HTML中的<a>标签设置超链接文本,然后将Label标签的setOpenExternalLinks()设置为True,以便允许访问超链接。

self.label.setText("<a href='https://www.mingrisoft.com'>明日学院</a>")
self.label.setOpenExternalLinks(True)  # 设置允许访问超链接

      当单击“明日学院”时,即可使用浏览器打开<a>标签中指定的网址。
运行结果:
在这里插入图片描述
完整的代码示例:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'untitled1.ui'
#
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(300, 250)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")

        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 300, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        # 设置标签控件
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(40, 40, 100, 201))
        # self.label.setText("我是一个标签,我的只有很多,未设置WordWrap为True时,我是显示不完全的,现在您可以看到我的全部内容啦")

        self.label.setText("<a href='https://www.mingrisoft.com'>明日学院</a>")
        self.label.setOpenExternalLinks(True)  # 设置允许访问超链接

        self.label.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)
        # self.label.setAlignment(QtCore.Qt.AlignLeading | QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)

        self.label.setWordWrap(True)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
        # self.pushButton.clicked.connect(self.open)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        # self.pushButton.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_())  # 程序关闭时退出进程

5. 为标签设置图片

      为Label标签设置图片时,需要使用QLabel类的setPixmap()方法,该方法中需要有一个QPixmap对象,表示图标对象。

from PyQt5.QtGui import QPixmap    # 导入QPixmap类
self.label.setPixmap(QPixmap('test.png'))   # 为label设置图片

在这里插入图片描述

运行效果如图:
在这里插入图片描述
完整的代码:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'untitled1.ui'
#
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import QPixmap    # 导入QPixmap类


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(600, 250)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")

        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 300, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        # 设置标签控件
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(40, 40, 506, 123))
        # self.label.setText("我是一个标签,我的只有很多,未设置WordWrap为True时,我是显示不完全的,现在您可以看到我的全部内容啦")

        # self.label.setText("<a href='https://www.mingrisoft.com'>明日学院</a>")
        # self.label.setOpenExternalLinks(True)  # 设置允许访问超链接

        # self.label.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)
        # self.label.setAlignment(QtCore.Qt.AlignLeading | QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)
        # self.label.setWordWrap(True)
        self.label.setPixmap(QPixmap("./image/test.png"))    # 为label设置图片

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
        # self.pushButton.clicked.connect(self.open)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        # self.pushButton.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_())  # 程序关闭时退出进程

6. 获取标签文本

获取Label标签中的文本需要使用QLabel类的text()方法。下面的代码实现在控制台中打印Label中的文本:

print(self.label.text())

运行结果:
在这里插入图片描述

2. LineEdit:单行文本框

      LineEdit是单行文本框,该控件只能输入单行字符串。
在这里插入图片描述
      LineEdit控件对应PyQt5中的QLineEdit类。

QLineEdit类的常用方法及说明
方法说明
setText()设置文本框内容
text()获取文本框内容
setPlaceholderText()设置文本框浮显文字
setMaxLength()设置允许文本框内输入字符的最大长度
setAlignment()设置文本对齐方式
setReadOnly()设置文本框只读
setFocus()使文本框得到焦点
setEchoMode()
  • 设置文本框显示字符的模式,有以下4种模式:
  • QLineEdit.Normal:正常显示输入的字符,这是默认设置;
  • QLineEdit.NoEcho:不显示任何输入的字符(不是不输入,只是不显示);
  • QLineEdit.Password:显示与平台相关的密码掩码字符,而不是实际输入的字符;
  • QLineEdit.PasswordEchoOnEdit:在编辑时显示字符,失去焦点后显示密码掩码字符。
setValidator()
  • 设置文本框验证器,有以下3种模式:
  • QIntValidator:限制输入整数;
  • QDoubleValidator:限制输入小数;
  • QRegExpValidator:检查输入是否符合设置的正则表达式。
setInputMask()
  • 设置掩码,掩码通常由掩码字符和分隔符组成,后面可以跟一个分号和空白字符,常用的掩码有以下几种形式:
  • 日期掩码:0000-00-00;
  • 时间掩码:00:00:00;
  • 序列号掩码:>AAAAA-AAAAA-AAAAA-AAAAA-AAAAA;#。
clear()清除文本框内容
QLineEdit类的常用信号及说明
信号说明
textChanged当更改文本框中的内容时发射该信号;
editingFinished当文本框中的内容编辑结束时发射该信号,以按下Enter为编辑结束标志。
示例:包括用户名和密码的登录窗口

      使用LineEdit控件,并结合Label控件制作一个简单的登录窗口,其中包含用户名和密码输入框,密码要求是8位数字,并且以掩码形式显示,步骤如下:

      (1)打开Qt Desinger设计器,从工具箱中向主窗口放入两个Label控件与两个LineEdit控件,然后分别将两个Label控件的text值修改为“用户名:”和“密码:”:
在这里插入图片描述

      (2)设计完成后,保存为.ui文件,并使用PyUIC工具将其转换为.py文件,并在表示密码的LineEdit文本框下面使用setEchoMode()将其设置为密码文本,同时使用setValidator()方法为其设置验证器,控制只能输入8位数字。

# 设置文本框为密码框
self.lineEdit_2.setEchoMode(QtWidgets.QLineEdit.Password)
# 设置只能输入8位数字
self.lineEdit_2.setValidator(QtGui.QIntValidator(10000000, 99999999))

在这里插入图片描述
      (3)为.py文件添加__main__主方法。

import sys

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_())   # 程序关闭时退出进程

在这里插入图片描述

      运行程序的效果如下:
在这里插入图片描述

在这里插入图片描述
整体代码:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'untitled1.ui'
#
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(393, 261)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(90, 60, 81, 21))
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(90, 110, 81, 16))
        self.label_2.setObjectName("label_2")
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setGeometry(QtCore.QRect(150, 60, 200, 21))
        self.lineEdit.setObjectName("lineEdit")
        self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_2.setGeometry(QtCore.QRect(150, 110, 200, 21))
        self.lineEdit_2.setObjectName("lineEdit_2")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 393, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        # 设置文本框为密码框
        self.lineEdit_2.setEchoMode(QtWidgets.QLineEdit.Password)
        # 设置只能输入8位数字
        self.lineEdit_2.setValidator(QtGui.QIntValidator(10000000, 99999999))

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label.setText(_translate("MainWindow", "用户名:"))
        self.label_2.setText(_translate("MainWindow", "密  码:"))


import sys

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_())   # 程序关闭时退出进程

      注意,在密码文本框中输入字母或者超过8位数字时,系统将自动控制其输入,文本框中不会显示任何内容。

      textChanged信号在一些要求输入值时实时执行操作的场景下经常使用。例如,上网购物时,更改购买的商品数量或者价格,总价格都会实时变化,如果用PyQt5设计类似这样的功能,就可以通过LineEdit控件的textChanged信号实现。

3. TextEdit:多行文本框

      TextEdit是多行文本框控件,主要用来显示多行的文本内容,当文本内容超出控件的显示范围时,该控件将显示垂直滚动条;另外,TextEdit控件不仅可以显示纯文本内容,还支持显示HTML网页
在这里插入图片描述
TextEdit控件对应PyQt5中的QTextEdit类。

QTextEdit类的常用方法及说明
方法描述
setPlainText()设置文本内容;
toPlainText()获取文本内容;
setTextColor()设置文本颜色,例如。将文本设置为红色,可以将该方法的参数设置为QtGui.QColor(255, 0, 0);
setTextBackgroundColor()设置文本的背景颜色,颜色参数与setTextColor()相同;
setHtml()设置HTML文档内容;
toHtml()获取HTML文档内容;
wordWrapMode()设置自动换行;
clear()清除所有内容。
示例:多行文本和HTML文本的对比显示

      使用Qt Designer设计器创建一个MainWindow窗口,在其中添加两个TextEdit控件,然后保存为.ui文件,使用PyUIC工具将.ui文件转换为.py文件,然后分别使用setPlainText()方法和setHtml()方法为两个TextEdit控件设置要显示的文本内容。

# 设置纯文本显示
self.textEdit.setPlainText('与失败比起来,有人对乏味和平庸的恐惧要严重的多。对他们而言,很好的事要比糟糕的事好,而糟糕的事要比平庸的事好,因为糟糕的事至少为生活添加了滋味。对我而言,对任何事都想要处之泰然,平庸的事为生活增添乏味,糟糕的事为生活增添苦味,美好的事为生活增添甜味。品味人生,就要尝尽各种味道,这样也没什么不好的。')
# 设置HTML文本显示
self.textEdit_2.setHtml("与失败比起来,有人对乏味和平庸的恐惧要严重的多。对他们而言,很好的事要比糟糕的事好,而糟糕的事要比平庸的事好,因为糟糕的事至少为生活添加了滋味。<font color='red' size='12'>对我而言,对任何事都想要处之泰然,平庸的事为生活增添乏味,糟糕的事为生活增添苦味,美好的事为生活增添甜味。</font>品味人生,就要尝尽各种味道,这样也没什么不好的。")

为.py文件添加__main__主方法,然后运行程序。
运行结果如下:
在这里插入图片描述
整体代码:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'untitled1.ui'
#
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(994, 525)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
        self.textEdit.setGeometry(QtCore.QRect(110, 90, 331, 311))
        self.textEdit.setObjectName("textEdit")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(250, 60, 72, 15))
        self.label.setObjectName("label")
        self.textEdit_2 = QtWidgets.QTextEdit(self.centralwidget)
        self.textEdit_2.setGeometry(QtCore.QRect(560, 90, 331, 311))
        self.textEdit_2.setObjectName("textEdit_2")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(700, 60, 72, 15))
        self.label_2.setObjectName("label_2")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 994, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        # 设置纯文本显示
        self.textEdit.setPlainText('与失败比起来,有人对乏味和平庸的恐惧要严重的多。对他们而言,很好的事要比糟糕的事好,'
                                   '而糟糕的事要比平庸的事好,因为糟糕的事至少为生活添加了滋味。对我而言,对任何事都想要处之泰然,'
                                   '平庸的事为生活增添乏味,糟糕的事为生活增添苦味,美好的事为生活增添甜味。品味人生,'
                                   '就要尝尽各种味道,这样也没什么不好的。')
        # 设置HTML文本显示
        self.textEdit_2.setHtml("与失败比起来,有人对乏味和平庸的恐惧要严重的多。对他们而言,很好的事要比糟糕的事好,"
                              "而糟糕的事要比平庸的事好,因为糟糕的事至少为生活添加了滋味。<font color='red' size='12'>对我而言,"
                              "对任何事都想要处之泰然,平庸的事为生活增添乏味,糟糕的事为生活增添苦味,美好的事为生活增添甜味。</font>品味人生,"
                              "就要尝尽各种味道,这样也没什么不好的。")

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "TextEdit应用"))
        self.label.setText(_translate("MainWindow", "纯文本"))
        self.label_2.setText(_translate("MainWindow", "HTML"))


# ########### 需要添加的代码,添加后才可以运行(即添加主函数)
import sys

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()   # 创建窗体对象
    ui = Ui_MainWindow()   # 创建PyQt设计器的窗体对象
    ui.setupUi(MainWindow)    # 调用PyQt窗体的方法对象进行初始化设置

    MainWindow.setWindowFlags(QtCore.Qt.Dialog)  # 显示一个有问号(?)和关闭按钮的对话框
    MainWindow.setWindowFlags(QtCore.Qt.WindowCloseButtonHint)  # 只显示关闭按钮

    MainWindow.show()    # 显示窗体
    sys.exit(app.exec_())   # 程序关闭时退出进程

4. SpinBox:整数数字选择控件

      SpinBox是一个整数数字选择控件,该控件提供一对上下箭头,用户可以单击上下箭头选择数值,也可以直接输入。如果输入的数值大于设置的最大值,或者小于设置的最小值,SpinBox将不会接受输入.
在这里插入图片描述
SpinBox控件对应PyQt5中的QSpinBox类。

QPinBox类的常用方法及说明
方法描述
setValue()设置控件的当前值;
setMaximum()设置最大值;
setMinmun()设置最小值;
setRange()设置取值范围(包括最大值和最小值);
setSingleStep()单击上下箭头时的步长值;
value()获取控件中的值。

      默认情况下,SpinBox控件的取值范围为0~99,步长值为1。
      在单击SpinBox控件的上下箭头时,可以通过发射valueChanged信号获取控件中的当前值。

示例:获取SpinBox中选择的数字

      使用Qt Designer设计器创建一个MainWindow窗口,在其中添加两个Label控件和一个SpinBox控件,然后保存为.ui文件,使用PyUIC工具将.ui文件转换为.py文件,在转换后的.py文件中,分别设置数字选择控件的最小值、最大值和步长值。
      关于SpinBox控件的关键代码:

self.spinBox = QtWidgets.QSpinBox(self.centralwidget)
self.spinBox.setGeometry(QtCore.QRect(20, 10, 101, 22))
self.spinBox.setObjectName("spinBox")
self.spinBox.setMinimum(0)    # 设置最小值
self.spinBox.setMaximum(100)   # 设置最大值
# 上面两行代码等同于下面使用setRange()设置上下限的这句代码
# self.spinBox.setRange(0,100)
self.spinBox.setSingleStep(2)    # 设置步长值

在这里插入图片描述
      自定义一个getvalue()方法,使用value()方法获取SpinBox控件中的当前值,并显示在Label控件中。

# 获取SpinBox的当前值,并显示在Label中
def getvalue(self):
	self.label_2.setText(str(self.spinBox.value()))

在这里插入图片描述
      将SpinBox控件的valueChanged信号与自定义的getvalue()槽函数相关联。

# 将valueChanged信号与自定义槽函数相关联
self.spinBox.valueChanged.connect(self.getvalue)

在这里插入图片描述
运行结果:
在这里插入图片描述
完整代码如下:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'untitled1.ui'
#
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(391, 354)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")

        self.spinBox = QtWidgets.QSpinBox(self.centralwidget)
        self.spinBox.setGeometry(QtCore.QRect(20, 10, 101, 22))
        self.spinBox.setObjectName("spinBox")
        self.spinBox.setMinimum(0)    # 设置最小值
        self.spinBox.setMaximum(100)   # 设置最大值
        # 上面两行代码等同于下面使用setRange()设置上下限的这句代码
        # self.spinBox.setRange(0,100)
        self.spinBox.setSingleStep(2)    # 设置步长值

        # 将valueChanged信号与自定义槽函数相关联
        self.spinBox.valueChanged.connect(self.getvalue)

        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(20, 30, 161, 31))
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(180, 35, 61, 21))
        self.label_2.setText("")
        self.label_2.setObjectName("label_2")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 391, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "TextEdit应用"))
        self.label.setText(_translate("MainWindow", "当前控件中显示的数值:"))

    # 获取SpinBox的当前值,并显示在Label中
    def getvalue(self):
        self.label_2.setText(str(self.spinBox.value()))

# ########### 需要添加的代码,添加后才可以运行(即添加主函数)
import sys

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()   # 创建窗体对象
    ui = Ui_MainWindow()   # 创建PyQt设计器的窗体对象
    ui.setupUi(MainWindow)    # 调用PyQt窗体的方法对象进行初始化设置

    MainWindow.setWindowFlags(QtCore.Qt.Dialog)  # 显示一个有问号(?)和关闭按钮的对话框
    MainWindow.setWindowFlags(QtCore.Qt.WindowCloseButtonHint)  # 只显示关闭按钮

    MainWindow.show()    # 显示窗体
    sys.exit(app.exec_())   # 程序关闭时退出进程

5. DoubleSpinBox:小数数字选择控件

      DoubleSpinBox与SpinBox控件类似,区别是,它用来选择小数数字,并且默认保留两位小数,它对应PyQt5中的QDoubleSpinBox类。
在这里插入图片描述
      DoubleSpinBox控件的使用方法与SpinBox类似,但由于它处理的是小数数字,因此,该控件提供了一个setDecimals()方法,用来设置小数的位数。

示例:设置DoubleSpinBox中的小数位数并获取选择的数字

      使用Qt Designer设计器创建一个MainWindow窗口,在其中添加两个Label控件和一个DoubleSpinBox控件,然后保存为.ui文件,使用PyUIC工具将.ui文件转换为.py文件,在转换后的.py文件中,分别设置小数数字选择控件的最小值、最大值、步长值,以及保留3位小数。有关DoubleSpinBox控件的关键代码如下:

self.doubleSpinBox = QtWidgets.QDoubleSpinBox(self.centralwidget)
self.doubleSpinBox.setGeometry(QtCore.QRect(20, 10, 101, 22))
self.doubleSpinBox.setObjectName("doubleSpinBox")
self.doubleSpinBox.setMinimum(0)           # 设置最小值
self.doubleSpinBox.setMaximum(99.999)      # 设置最大值
self.doubleSpinBox.setSingleStep(0.001)    # 设置步长值
self.doubleSpinBox.setDecimals(3)          # 设置保留3位小数

在这里插入图片描述
      自定义一个getvalue()方法,使用value()方法获取DoubleSpinBox控件中的当前值,并显示在Label控件中。

# 获取SpinBox的当前值,并显示在Label中
# 实际上该方法需要改进,改进后的代码在后面
def getvalue(self):
	self.label_2.setText(str(self.doubleSpinBox.value()))

在这里插入图片描述
      将DoubleSpinBox控件的valueChanged信号与自定义的getvalue()槽函数相关联。

# 将valueChanged信号与自定义槽函数相关联
self.doubleSpinBox.valueChanged.connect(self.getvalue)

在这里插入图片描述
      为.py文件添加__main__主方法,然后运行程序,单击小数数字选择控件的上下箭头时,在Label控件中实时显示小数数字选择控件中的数值。运行效果如下图所示:
在这里插入图片描述
但是会出现超长的小数问题:
在这里插入图片描述
解决办法参考:https://blog.csdn.net/qq_39951477/article/details/111264698

问题1:解决小数位数显示问题
需要改进原本自定义的槽方法getValue(): ```python # 改进后的方法: def getvalue(self): val = str(round(self.doubleSpinBox.value(), 3)) index = val.index(".") # 找到小数点在数字字符串中所在的下标 if len(val[index + 1:]) == 2: # 只有两位小数 val = val + "0" elif len(val[index + 1:]) == 1: # 只有一位小数 val = val + "00" else: val = val self.label_2.setText(val) ``` ![在这里插入图片描述](https://img-blog.csdnimg.cn/ccc5e4adb00942df857f7a01b84979f1.png)

运行结果:(小数位始终只会是3)
在这里插入图片描述
完整代码如下:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'untitled1.ui'
#
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(391, 354)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(20, 40, 161, 31))
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(190, 40, 100, 21))
        self.label_2.setText("")
        self.label_2.setObjectName("label_2")

        self.doubleSpinBox = QtWidgets.QDoubleSpinBox(self.centralwidget)
        self.doubleSpinBox.setGeometry(QtCore.QRect(20, 10, 101, 22))
        self.doubleSpinBox.setObjectName("doubleSpinBox")
        self.doubleSpinBox.setMinimum(0)           # 设置最小值
        self.doubleSpinBox.setMaximum(99.999)      # 设置最大值
        self.doubleSpinBox.setSingleStep(0.001)    # 设置步长值
        self.doubleSpinBox.setDecimals(3)          # 设置保留3位小数

        # 将valueChanged信号与自定义槽函数相关联
        self.doubleSpinBox.valueChanged.connect(self.getvalue)

        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 391, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "TextEdit应用"))
        self.label.setText(_translate("MainWindow", "当前控件中显示的数值:"))

    # 获取SpinBox的当前值,并显示在Label中
    # 以下方式为原文的方式,会出现label上显示小数位数和预期不符
    # def getvalue(self):
    #     self.label_2.setText(str(self.doubleSpinBox.value()))

    # 从网上找的方法:https://blog.csdn.net/qq_39951477/article/details/111264698
    # 改进后的方法:
    def getvalue(self):
        val = str(round(self.doubleSpinBox.value(), 3))
        index = val.index(".")    # 找到小数点在数字字符串中所在的下标
        if len(val[index + 1:]) == 2:   # 只有两位小数
            val = val + "0"
        elif len(val[index + 1:]) == 1:   # 只有一位小数
            val = val + "00"
        else:
            val = val
        self.label_2.setText(val)




# ########### 需要添加的代码,添加后才可以运行(即添加主函数)
import sys

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()   # 创建窗体对象
    ui = Ui_MainWindow()   # 创建PyQt设计器的窗体对象
    ui.setupUi(MainWindow)    # 调用PyQt窗体的方法对象进行初始化设置

    MainWindow.setWindowFlags(QtCore.Qt.Dialog)  # 显示一个有问号(?)和关闭按钮的对话框
    MainWindow.setWindowFlags(QtCore.Qt.WindowCloseButtonHint)  # 只显示关闭按钮

    MainWindow.show()    # 显示窗体
    sys.exit(app.exec_())   # 程序关闭时退出进程

6. LCDNumber:液晶数字显示控件

      LCDNumber控件主要用来显示液晶数字。
在这里插入图片描述
LCDNumber控件对应PyQt5中的QLCDNumber类。

QLCDNumber类的常用方法及说明
方法描述
setDigitCount()设置可以显示的数字数量;
setProperty()设置属性功能;
setMode()设置显示数字的模式,有4种模式:Bin(二进制)、Oct(八进制)、Dec(十进制)、Hex(十六进制);
setSegementStyle()设置显示样式,有3种样式:OutLine、Filled和Flat,它们的效果分别如下表所示;
value()获取显示的数值。
样式效果
OutLine
Filled
Flat
示例:液晶显示屏中的数字显示

      使用Qt Designer设计器创建一个MainWindow窗口,在其中添加一个Label控件、一个LineEdit控件和一个LCDNumber控件,其中,LineEdit控件用来输入数字,LCDNumber控件用来显示LineEdit控件中的数字,将设计完成的窗口保存为.ui文件,使用PyUIC工具将.ui文件转换为.py文件,在转换后的.py文件中,设置LCDNumber液晶显示控件的最大显示数字位数、显示样式及模式。有关LCDNumber控件的关键代码如下:

self.lcdNumber = QtWidgets.QLCDNumber(self.centralwidget)
self.lcdNumber.setGeometry(QtCore.QRect(20, 40, 161, 41))
self.lcdNumber.setDigitCount(7)                            # 设置最大显示7位数字
self.lcdNumber.setMode(QtWidgets.QLCDNumber.Dec)           # 设置默认以十进制显示数字
self.lcdNumber.setSegmentStyle(QtWidgets.QLCDNumber.Flat)   # 设置数字显示屏的显示样式
self.lcdNumber.setObjectName("lcdNumber")

在这里插入图片描述
      自定义一个setvalue()方法,使用setProperty()方法为LCDNumber控件设置要显示的数字为LineEdit文本框中输入的数字。

# 定义槽函数,用来在液晶显示屏中显示文本框中的数字
def setvalue(self):
	self.lcdNumber.setProperty("value", self.lineEdit.text())
    

在这里插入图片描述
      将LineEdit控件的editingFinished信号与自定义的setvalue()槽函数相关联,以便在文本框编辑结束后执行槽函数中定义的操作。

# 文本框编辑结束时,发射editingFinished信号,与自定义槽函数关联
self.lineEdit.editingFinished.connect(self.setvalue)

为.py文件添加__main__主方法,然后运行程序,在文本框中输入数字,按Enter键,即可将输入的数字显示在液晶显示控件中。当文本框中输入的数字大于7位时,则会在液晶显示控件中以科学计数法的形式进行显示。
运行结果:
在这里插入图片描述
在这里插入图片描述
完整代码如下:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'untitled1.ui'
#
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(388, 354)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")

        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(40, 50, 91, 16))
        self.label.setObjectName("label")

        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setGeometry(QtCore.QRect(130, 50, 121, 21))
        self.lineEdit.setObjectName("lineEdit")

        self.lcdNumber = QtWidgets.QLCDNumber(self.centralwidget)
        self.lcdNumber.setGeometry(QtCore.QRect(40, 90, 211, 71))
        self.lcdNumber.setDigitCount(7)  # 设置最大显示7位数字
        self.lcdNumber.setMode(QtWidgets.QLCDNumber.Dec)  # 设置默认以十进制显示数字
        self.lcdNumber.setSegmentStyle(QtWidgets.QLCDNumber.Flat)  # 设置数字显示屏的显示样式
        self.lcdNumber.setObjectName("lcdNumber")

        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 388, 26))
        self.menubar.setObjectName("menubar")

        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

        # 文本框编辑结束时,发射editingFinished信号,与自定义槽函数关联
        self.lineEdit.editingFinished.connect(self.setvalue)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "LCDNumber的应用"))
        self.label.setText(_translate("MainWindow", "请输入数字:"))

    # 定义槽函数,用来在液晶显示屏中显示文本框中的数字
    def setvalue(self):
        self.lcdNumber.setProperty('value', self.lineEdit.text())
        # self.lcdNumber.display(self.lineEdit.text())

# ########### 需要添加的代码,添加后才可以运行(即添加主函数)
import sys

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()   # 创建窗体对象
    ui = Ui_MainWindow()   # 创建PyQt设计器的窗体对象
    ui.setupUi(MainWindow)    # 调用PyQt窗体的方法对象进行初始化设置

    MainWindow.setWindowFlags(QtCore.Qt.Dialog)  # 显示一个有问号(?)和关闭按钮的对话框
    MainWindow.setWindowFlags(QtCore.Qt.WindowCloseButtonHint)  # 只显示关闭按钮

    MainWindow.show()    # 显示窗体
    sys.exit(app.exec_())   # 程序关闭时退出进程

3. 按钮类控件

      该类控件主要用来执行一些命令操作,主要有PushButton、ToolButton、CommandLinkButton、RadioButton和CheckBox等。

1. PushButton:按钮

      常用控件之一,允许单击执行操作。可显示文本,也可显示图像。被单击时会有按下和释放的视觉状态。
在这里插入图片描述

PushButton控件对应PyQt5中的QPushButton类。

QPushButton类的常用方法及说明
方法说明
setText()设置按钮所现实的文本
text()获取按钮所显示的文本
setIcon()设置按钮上的图标,可以将参数设置为QtGui.GIcon(‘图标路径’)
setIconSize()设置按钮图标的大小,参数可以设置为QtCore.QSize(int width, int height)
setEnabled()设置按钮是否可用,参数设置为False时,按钮为不可用状态。
setShortcut()设置按钮的快捷键,参数可以设置为键盘中的按键或快捷键,例如“Alt + 0”

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

示例:制作登录窗口

      完善LineEdit中的示例,为系统登录窗口添加“登录”和“退出”按钮,当单击“登录”按钮时,弹出用户输入的用户名和密码;而当单击“退出”按钮时,关闭当前登录窗口。
完整代码如下:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'untitled1.ui'
#
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


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(317, 292)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(50, 50, 72, 15))
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(50, 90, 72, 15))
        self.label_2.setObjectName("label_2")
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setGeometry(QtCore.QRect(110, 50, 141, 21))
        self.lineEdit.setObjectName("lineEdit")
        self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_2.setGeometry(QtCore.QRect(110, 90, 141, 21))
        self.lineEdit_2.setObjectName("lineEdit_2")
        # 设置文本框为密码
        self.lineEdit_2.setEchoMode(QtWidgets.QLineEdit.Password)
        # 设置只能输入8位数字
        self.lineEdit_2.setValidator(QtGui.QIntValidator(10000000, 99999999))

        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(70, 130, 61, 31))
        self.pushButton.setObjectName("pushButton")
        # 为登录按钮设置图标
        self.pushButton.setIcon(QIcon(QPixmap("./image/login.ico")))

        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(170, 130, 61, 31))
        self.pushButton_2.setObjectName("pushButton_2")
        # 为退出按钮设置图标
        self.pushButton_2.setIcon(QIcon(QPixmap("./image/exit.ico")))

        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 317, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        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 retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "TextEdit应用"))
        self.label.setText(_translate("MainWindow", "用户名:"))
        self.label_2.setText(_translate("MainWindow", "密 码:"))
        self.pushButton.setText(_translate("MainWindow", "登录"))
        # (替换上面的一句)设置登录快捷键:Alt+L
        # self.pushButton.setText(_translate("MainWindow", "登录(&L)"))
        self.pushButton_2.setText(_translate("MainWindow", "退出"))
        # (替换上面的一句)设置退出快捷键:Alt+Q
        # self.pushButton_2.setText(_translate("MainWindow", "退出(&Q)"))

    # 自定义登录的槽函数
    def login(self):
        from PyQt5.QtWidgets import QMessageBox
        # 使用information()方法弹出信息提示框
        QMessageBox.information(MainWindow, "登录信息", "用户名:" + self.lineEdit.text() + "   密码:" + self.lineEdit_2.text(), QMessageBox.Ok)


import sys

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

运行结果:
在这里插入图片描述
点击“登录”按钮:
在这里插入图片描述
点击退出即可终止程序运行。

设置按钮的快捷键

若想为PushButton按钮设置快捷键,可在创建对象时指定其文本,并在文本中包括&符号,&符号后的第一个字母默认作为快捷键。例如,设置上面登录和退出按钮的快捷键:

# 设置登录快捷键:Alt+L
self.pushButton.setText(_translate("MainWindow", "登录(&L)"))
# 设置退出快捷键:Alt+Q
self.pushButton_2.setText(_translate("MainWindow", "退出(&Q)"))

修改完后,按Alt + L即可执行与单击“登录”按钮相同的操作,按Alt + Q即可执行与单击“退出”按钮相同的操作。

2. ToolButton:工具按钮

      ToolButton控件是一个工具按钮,它本质上是一个按钮,只是在按钮中提供了默认文本“…”和可选的箭头类型,它对应PyQt5中的QToolButton类。
在这里插入图片描述
      ToolButton控件的使用方法与PushButton类似,不同的是,ToolButton控件可以设置工具按钮的显示样式和箭头类型,其中,工具按钮的显示样式通过QToolButton类的setToolButtonStyle()方法进行设置。

QToolButton的setToolButtonStyle()方法支持的样式
样式说明
Qt.ToolButtonIconOnly只显示图标
Qt.ToolButtonTextOnly只显示文本
Qt.ToolButtonTextBesideIcon文本显示在图标的旁边
Qt.ToolButtonTextUnderIcon文本显示在图标的下面
Qt.ToolButtonFollowStyle跟随系统样式

      工具按钮的箭头类型通过QToolButton类的setArrowType()方法进行设置。

QToolButton的setArrowType()方法支持的箭头类型
箭头类型说明
Qt.NoArrow没有箭头
Qt.UpArrow向上的箭头
Qt.DownArrow向下的箭头
Qt.LeftArrow向左的箭头
Qt.RightArrow向右的箭头
示例:设计一个向上箭头的工具按钮

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

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

在这里插入图片描述

运行结果:
在这里插入图片描述

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

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

在这里插入图片描述
运行结果:
在这里插入图片描述
完整代码:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'untitled1.ui'
#
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(317, 292)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.toolButton = QtWidgets.QToolButton(self.centralwidget)
        # self.toolButton.setGeometry(QtCore.QRect(110, 80, 100, 100))
        self.toolButton.setObjectName("toolButton")

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

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

        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 317, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "TextEdit应用"))
        self.toolButton.setText(_translate("MainWindow", "..."))

import sys


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())


3. CommandaLinkButton:命令链接按钮

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

示例:命令链接按钮的使用

      使用Qt Designer设计器创建一个MainWindow窗口,其中添加一个CommandLinkButton控件,并设置其文本为“https://www.mingrisoft.com”,运行程序。
程序代码:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'untitled1.ui'
#
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(373, 186)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.commandLinkButton = QtWidgets.QCommandLinkButton(self.centralwidget)
        self.commandLinkButton.setGeometry(QtCore.QRect(31, 50, 291, 48))
        self.commandLinkButton.setObjectName("commandLinkButton")



        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 373, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "TextEdit应用"))
        self.commandLinkButton.setText(_translate("MainWindow", "https://www.mingrisoft.com"))


import sys


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

CommandLinkButton控件的默认效果:
在这里插入图片描述
鼠标移动到CommandLinkButton控件上的效果:
在这里插入图片描述

4. RadioButton:单选按钮

      RadioButton是单选按钮控件,它为用户提供由两个或多个互斥选项组成的选项集,当用户选中某单选按钮时,同一组中的其他单选按钮不能同时选定。
在这里插入图片描述
RadioButton控件对应PyQt5中的QRadioButton类。

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

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

示例:选择用户登录角色

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

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'untitled1.ui'
#
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMessageBox


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(310, 250)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        # "用户名"标签
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(50, 40, 72, 15))
        self.label.setObjectName("label")
        # "密码"标签
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(50, 70, 72, 20))
        self.label_2.setObjectName("label_2")
        # “用户名”输入框
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setGeometry(QtCore.QRect(110, 40, 131, 21))
        self.lineEdit.setObjectName("lineEdit")
        # “密码”输入框
        self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_2.setGeometry(QtCore.QRect(110, 70, 131, 21))
        self.lineEdit_2.setObjectName("lineEdit_2")
        self.lineEdit_2.setEchoMode(QtWidgets.QLineEdit.Password)  # 设置文本框为密码
        self.lineEdit_2.setValidator(QtGui.QIntValidator(10000000, 99999999))
        # “登录”按钮
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(50, 140, 91, 28))
        self.pushButton.setObjectName("pushButton")
        # “重置”按钮
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(160, 140, 93, 28))
        self.pushButton_2.setObjectName("pushButton_2")
        # “管理员”单选框
        self.radioButton = QtWidgets.QRadioButton(self.centralwidget)
        self.radioButton.setGeometry(QtCore.QRect(60, 110, 115, 19))
        self.radioButton.setObjectName("radioButton")
        self.radioButton.setChecked(True)   # 设置管理员单选框默认选中
        # “普通用户”单选框
        self.radioButton_2 = QtWidgets.QRadioButton(self.centralwidget)
        self.radioButton_2.setGeometry(QtCore.QRect(160, 110, 115, 19))
        self.radioButton_2.setObjectName("radioButton_2")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 386, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        # 绑定槽函数
        # 为登录按钮的clicked信号绑定自定义槽函数
        self.pushButton.clicked.connect(self.login)
        # 为退出按钮的clicked信号绑定MainWindow窗口自带的close槽函数
        self.pushButton_2.clicked.connect(MainWindow.close)
        # 为单选按钮的toggled信号绑定自定义槽函数
        self.radioButton.toggled.connect(self.select)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "TextEdit应用"))
        self.label.setText(_translate("MainWindow", "用户名:"))
        self.label_2.setText(_translate("MainWindow", "密  码:"))
        self.pushButton.setText(_translate("MainWindow", "登录"))
        self.pushButton_2.setText(_translate("MainWindow", "退出"))
        self.radioButton.setText(_translate("MainWindow", "管理员"))
        self.radioButton_2.setText(_translate("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)


import sys


# 主方法,程序从此处启动PyQt设计的窗体
if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()   # 创建窗体对象
    ui = Ui_MainWindow()       # 创建P有Q他设计的窗体对象
    ui.setupUi(MainWindow)    # 调用PyQt窗体方法,对窗体对象初始化设置
    MainWindow.show()     # 显示窗体
    sys.exit(app.exec_())     # 程序关闭时退出进程

运行效果:
在这里插入图片描述
在这里插入图片描述

5. CheckBox:复选框

      CheckBox是复选框控件,它用来表示是否选取了某个选项条件,常用于为用户提供具有是/否或真/假值的选项,它对应PyQt5中的QCheckBox类。
在这里插入图片描述
      CheckBox控件的使用与RadioButton控件类似,但它是为用户提供“多选多”的选择,另外,它除了选中未选中两种状态之外,还提供了第三种状态:半选中。如果需要第三种状态,需要使用QCheckBox类的setTristate()方法使其生效,并且可以使用checkState()方法查询当前状态。

CheckBox控件的三种状态值及说明
方法说明
QT.Checked选中
QT.PartiallyChecked半选中
QT.Unchecked未选中
      CheckBox控件最常用的信号是stateChanged,用来在复选框的状态发生改变时发射。
示例:设置用户权限

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

    # 自定义槽函数,用于记录选中的权限状态
    def getvalue(self):
        oper = ""    # 记录用户权限
        if self.checkBox.isChecked():    # 判断复选框是否选中
            oper += self.checkedBox.text()    # 记录选中的权限
        if self.checkBox_2.isChecked():
            oper += "\n" + self.checkedBox_2.text()
        if self.checkedBox_3.isChecked():
            oper += "\n" + self.checkedBox_3.text()
        if self.checkedBox_4.isChecked():
            oper += "\n" + self.checkedBox_4.text()
        if self.checkedBox_5.isChecked():
            oper += "\n" + self.checkedBox_5.text()
        from PyQt5.QtWidgets import QMessageBox
        # 使用information()方法弹出信息提示,显示所有选择的权限
        QMessageBox.information(MainWindow, "提示", "您选择的权限如下: \n" + oper, QMessageBox.Ok)

      将“设置”按钮的clicked信号与自定义的槽函数getvalue()相关联。

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

为.py文件添加__main__主方法,然后运行程序,选中相应权限的复选框,单击“设置”按钮,即可在弹出提示框中显示用户选择的权限。
在这里插入图片描述
在这里插入图片描述
完整代码如下:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'untitled1.ui'
#
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(333, 235)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.checkBox = QtWidgets.QCheckBox(self.centralwidget)
        self.checkBox.setGeometry(QtCore.QRect(40, 40, 131, 21))
        self.checkBox.setObjectName("checkBox")
        self.checkBox_2 = QtWidgets.QCheckBox(self.centralwidget)
        self.checkBox_2.setGeometry(QtCore.QRect(40, 80, 91, 19))
        self.checkBox_2.setObjectName("checkBox_2")
        self.checkBox_3 = QtWidgets.QCheckBox(self.centralwidget)
        self.checkBox_3.setGeometry(QtCore.QRect(40, 120, 91, 19))
        self.checkBox_3.setObjectName("checkBox_3")
        self.checkBox_4 = QtWidgets.QCheckBox(self.centralwidget)
        self.checkBox_4.setGeometry(QtCore.QRect(210, 40, 91, 19))
        self.checkBox_4.setObjectName("checkBox_4")
        self.checkBox_5 = QtWidgets.QCheckBox(self.centralwidget)
        self.checkBox_5.setGeometry(QtCore.QRect(210, 80, 91, 19))
        self.checkBox_5.setObjectName("checkBox_5")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(210, 120, 81, 31))
        self.pushButton.setObjectName("pushButton")

        # 设置按钮的clicked信号与自定义的槽函数getvalue()相关联。代码如下:
        self.pushButton.clicked.connect(self.getvalue)

        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 333, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)



    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "设置用户权限"))
        self.checkBox.setText(_translate("MainWindow", "基本信息管理"))
        self.checkBox_2.setText(_translate("MainWindow", "进货管理"))
        self.checkBox_3.setText(_translate("MainWindow", "销售管理"))
        self.checkBox_4.setText(_translate("MainWindow", "库存管理"))
        self.checkBox_5.setText(_translate("MainWindow", "系统管理"))
        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()
        if self.checkBox_5.isChecked():
            oper += "\n" + self.checkBox_5.text()
        from PyQt5.QtWidgets import QMessageBox
        # 使用information()方法弹出信息提示,显示所有选择的权限
        QMessageBox.information(MainWindow, "提示", "您选择的权限如下: \n" + oper, QMessageBox.Ok)


import sys


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

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

4. 选择列表类控件

      选择列表类控件主要以列表形式为用户提供选择的项目,用户可从中选择项。该类控件包括ComboBox、FontComboBox和ListWidget等。

1. CimboBox:下拉组合框

      ComboBox控件,又称为下拉组合框控件,它主要用于在下拉组合框中显示数据,用户可以从中选择项。
在这里插入图片描述

QComboBox类的常用方法及说明
方法说明
addItem()添加一个下拉列表项
addItems()从列表中添加下拉选项
currentText()获取选中项的文本
currentIndex()获取选中项的索引
itemText(index)获取索引为index的项的文本
setItemText(index)设置索引为index的项的文本
count()获取所有选项的数量
clear()删除所有选项

      ComboBox控件常用的信号有两个:activated和currentIndexChanged,其中,activated信号在用户选中一个下拉选项时发射,而currentIndexChanged信号则在下拉选项的索引发生改变时发射

示例:在下拉列表中选择职位

      在Qt Designer设计器中创建一个窗口,实现通过ComboBox控件选择职位的功能。在窗口中添加两个Label控件和一个ComboBox,其中,第一个Label用来作为标识,将文本设置为“职位:”,第二个Label用来显示ComboBox中选择的职位;ComboBox控件用来作为职位的下拉列表。设计完成后保存为.ui文件,并使用PyUIC工具将其转换为.py代码文件。在.py代码文件中自定义一个showinfo()方法,用来将ComboBox下拉列表中选择的项显示在Label标签中。
槽方法如下:

# 设置槽方法
def showinfo(self):
	self.label_2.setText("您选择的职位是:" + self.comboBox.currentText())   # 显示选择的职位
    

      为ComboBox设置下拉列表项及信号与槽的关联。关联代码如下:

# 定义职位列表
list1 = ["总经理", "副总经理", "人事部经理", "财务部经理", "部门经理", "普通员工"]
self.comboBox.addItems(list1)  # 将职位列表添加到ComboBox下拉列表中
# 将ComboBox控件的选项更改信号与自定义槽函数关联
self.comboBox.currentIndexChanged.connect(self.showinfo)

      为.py文件添加__main__主方法,然后运行程序,当在职位列表中选中某个职位时,将会在下方的Label标签中显示选中的职位。
运行结果如下:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
完整代码如下:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'untitled1.ui'
#
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(333, 235)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(90, 50, 72, 15))
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(80, 90, 200, 16))
        self.label_2.setWordWrap(False)
        self.label_2.setObjectName("label_2")
        self.comboBox = QtWidgets.QComboBox(self.centralwidget)
        self.comboBox.setGeometry(QtCore.QRect(130, 50, 105, 22))
        self.comboBox.setObjectName("comboBox")

        # 定义职位列表
        list1 = ["总经理", "副总经理", "人事部经理", "财务部经理", "部门经理", "普通员工"]
        self.comboBox.addItems(list1)  # 将职位列表添加到ComboBox下拉列表中
        # 将ComboBox控件的选项更改信号与自定义槽函数关联
        self.comboBox.currentIndexChanged.connect(self.showinfo)

        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 333, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "设置用户权限"))
        self.label.setText(_translate("MainWindow", "职位:"))
        # self.label_2.setText(_translate("MainWindow", "您选择的职位是:"))
        # self.label_2.setText(_translate("MainWindow", ""))

    # 设置槽方法
    def showinfo(self):
        self.label_2.setText("您选择的职位是:" + self.comboBox.currentText())   # 显示选择的职位


import sys


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

2. FontComboBox:字体组合框

      FontComboBox控件又称为字体组合框控件,它主要用于在下拉组合框中显示并选择字体,它对应PyQt5中的QFontComboBox类。

在这里插入图片描述
      FontComboBox控件的使用与ComboBox类似,但由于它的主要作用是选择字体,所以QFontComboBox类中提供了一个setFontFilters()方法,用来设置可以选择的字体。

QFontComboBox类的setFontFilters()方法的参数及说明
参数说明
QFontComboBox.AllFonts所有字体
QFontComboBox.ScalableFonts可以自动伸缩的字体
QFontComboBox.NonScalableFonts不自动伸缩的字体
QFontComboBox.MonospacedFonts等宽字体
QFontComboBox.ProportionalFonts比例字体
示例:动态改变标签的字体

      在Qt Designer设计器中创建一个窗口,实现通过FontComboBox动态改变Label标签字体的功能。在窗口中添加一个Label控件和一个FontComboBox,其中,Label用来显示文本,而FontComboBox控件用来选择字体。设计完成后保存为.ui文件,并使用PyUIC工具将其转换为.py代码文件。在.py代码文件中自定义一个setfont()方法,用来将选择的字体设置为Label标签的字体。
      槽函数的代码如下:

# 自定义槽函数,用来将选择的字体设置为Label标签的字体
def setfont(self):
	print(self.fontComboBox.currentText())   # 控制台中输出选择的字体
	# 为Label设置字体
	self.label.setFont(QtGui.QFont(self.fontComboBox.currentText()))

      为FontComboBox设置要显示的字体及信号与槽的关联。关联代码如下:

# 设置字体组合框中显示所有字体
self.fontComboBox.setFontFilters(QtWidgets.QFontComboBox.AllFonts)
# 当选择的字体改变时,发射currentIndexChanged信号,调用setfont槽函数
self.fontComboBox.currentIndexChanged.connect(self.setfont)

      为.py文件添加__main__主方法,然后运行程序,在窗口中的字体下拉组合框中选择某种字体时,会在控制台中输出选择的字体,同时,Label标签中的字体也会更改为选择的字体。如图9.46和图9.47所示是在字体下拉组合框中分别选择“华文琥珀”字体和“楷体”字体时的效果。
在这里插入图片描述
在这里插入图片描述
      完整代码如下:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'untitled1.ui'
#
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(333, 172)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.fontComboBox = QtWidgets.QFontComboBox(self.centralwidget)
        self.fontComboBox.setGeometry(QtCore.QRect(30, 20, 279, 22))
        self.fontComboBox.setObjectName("fontComboBox")

        # 设置字体组合框中显示所有字体
        self.fontComboBox.setFontFilters(QtWidgets.QFontComboBox.AllFonts)
        # 当选择的字体改变时,发射currentIndexChanged信号,调用setfont槽函数
        self.fontComboBox.currentIndexChanged.connect(self.setfont)

        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(50, 70, 251, 31))
        self.label.setObjectName("label")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 333, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "设置用户权限"))
        self.label.setText(_translate("MainWindow", "长风破浪会有时,直挂云帆济沧海。"))

    # 自定义槽函数,用来将选择的字体设置为Label标签的字体
    def setfont(self):
        print(self.fontComboBox.currentText())  # 控制台中输出选择的字体
        # 为Label设置字体
        self.label.setFont(QtGui.QFont(self.fontComboBox.currentText()))


import sys


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

3. ListWidget:列表

      PyQt5提供了两种列表,分别是ListWidget和ListView,其中,ListView是基于模型的,它是ListWidget的父类,使用ListView时,首先需要建立模型,然后再保存数据;而ListWidget是ListView的升级版本,它已经内置了一个数据存储模型QListWidgetItem,我们在使用时,不必自己建立模型,而直接使用addItem()或者addItems()方法即可添加列表项。所以在实际开发时,推荐使用ListWidget控件作为列表。
在这里插入图片描述
      ListWidget控件对应PyQt5中的QListWidget类。

QListWidget类的常用方法及说明
方法说明
addItem()向列表中添加项。
addItems()一次向列表中添加多项。
insertItem()在指定索引处插入项。
setCurrentItem()设置当前选择项。
item.setToolTip()设置提示内容。
item.isSelected()判断项是否选中。
setSelectionMode()
  • 设置列表的选择模式,支持以下5种模式。
  • QAbstractItemView.NoSelection:不能选择;
  • QAbstractItemView.SingleSelection:单选;
  • QAbstractItemView.MultiSelection:多选;
  • QAbstractItemView.ExtendedSelection:正常单选,按Ctrl或者Shift后,可以多选;
  • QAbstractItemView.ContiguousSelection:与ExtendedSelection类似。
setSelectionBehavior()
  • 设置选择项的方式,支持以下3种方式。
  • QAbstractItemView.SelectItems:选中当前项;
  • QAbstractItemView.SelectRows:选中整行;
  • QAbstractItemView.SelectColumns:选中整列。
setWordWrap()设置是否自动换行,True表示自动换行,False表示不自动换行。
setViewMode()
  • 设置显示模式,有以下两种显示模式。
  • QListView.ListMode:以列表形式显示;
  • QListView.IconMode:以图表形式显示。
item.text()获取项的文本。
clear()删除所有列表项。

ListWidget控件常用的信号有两个:currentItemChangeditemClicked,currentItemChanged信号在列表中的选择项发生改变时发射,而itemClicked信号在单击列表中的项时发射

示例:用列表展示内地电影票房总排行榜

      2019年,我国的年电影票房已经突破642亿元,较2018年同期增长5.4%,其中,国产电影总票房411.75亿元,同比增长8.65%,市场占比64.07%,从中可以看出,国产电影在内地票房中的占比变得越来越重要,这其中的一个关键因素是,国产电影的质量有了很大的飞跃。近几年,我们所熟知的《战狼2》《我和我的祖国》《流浪地球》等优质国产电影不断呈现在大荧幕上,而观众也用高票房回馈了这些优秀的国产电影。本实例将使用PyQt5中的ListWidget列表展示内地票房总排行榜的前10名,从中可以看到,其中的90%都是国产电影。
      打开Qt Designer设计器,新建一个窗口,在窗口中添加一个ListWidget控件,设计完成后保存为.ui文件,并使用PyUIC工具将其转换为.py代码文件。在.py代码文件中,首先对ListWidget的显示数据及itemClicked信号进行设置。

# 设置列表中可以多选
self.listWidget.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection)
# 设置选中方式为整行选中
self.listWidget.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
# 设置以列表形式显示数据
self.listWidget.setViewMode(QtWidgets.QListView.ListMode)
# 设置自动换行
self.listWidget.setWordWrap(True)
from collections import OrderedDict
# 定义有序字典,作为List列表的数据源
dict = OrderedDict({'第1名': '战狼2,2017年上映,票房56.83亿', '第2名': '哪吒之魔童降世,2019年上映,票房50.12亿', '第3名': '流浪地球,2019年上映,票房46.86亿', '第4名': '复仇者联盟:终局之战,2019年上映,票房42.50亿', '第5名': '红海行动,2018年上映,票房36.51亿', '第6名': '唐人街探案2,2018年上映,票房33.98亿', '第7名': '美人鱼,2016年上映,票房33.86亿', '第8名': '我和我的祖国,2019年上映,票房31.71亿', '第9名': '我不是药神,2018年上映,票房31.00亿', '第10名': '中国机长,2019年上映,票房29.13亿'})
for key, value in dict.items():      # 遍历字典,并分别获取到键值
	self.item = QtWidgets.QListWidgetItem(self.listWidget)    # 创建列表项
	self.item.setText(key + ":" + value)     # 设置项文本
	self.item.setToolTip(value)    # 设置提示文字
self.listWidget.itemClicked.connect(self.gettext)

      Python中的字典默认是无序的,可以借助collections模块的OrderedDict类来使字典有序

编写槽函数如下:

def gettext(self, item):          # 自定义槽函数,获取列表中项的值
	if item.isSelected():      # 判断项是否选中
		from PyQt5.QtWidgets import QMessageBox
		QMessageBox.information(MainWindow, "提示", "您选择的是:" + item.text(), QMessageBox.Ok)

      为.py文件添加__main__主方法,然后运行程序。当用户单击列表中的某项时,弹出提示框,提示选择了某一项。
运行结果如下:
在这里插入图片描述
在这里插入图片描述
完整代码如下:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'untitled1.ui'
#
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(564, 391)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.listWidget = QtWidgets.QListWidget(self.centralwidget)
        self.listWidget.setGeometry(QtCore.QRect(23, 30, 511, 311))
        self.listWidget.setObjectName("listWidget")

        # 设置列表中可以多选
        self.listWidget.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection)
        # 设置选中方式为整行选中
        self.listWidget.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
        # 设置以列表形式显示数据
        self.listWidget.setViewMode(QtWidgets.QListView.ListMode)
        # 设置自动换行
        self.listWidget.setWordWrap(True)
        from collections import OrderedDict
        # 定义有序字典,作为List列表的数据源
        dict = OrderedDict(
            {'第1名': '战狼2,2017年上映,票房56.83亿', '第2名': '哪吒之魔童降世,2019年上映,票房50.12亿', '第3名': '流浪地球,2019年上映,票房46.86亿',
             '第4名': '复仇者联盟:终局之战,2019年上映,票房42.50亿', '第5名': '红海行动,2018年上映,票房36.51亿', '第6名': '唐人街探案2,2018年上映,票房33.98亿',
             '第7名': '美人鱼,2016年上映,票房33.86亿', '第8名': '我和我的祖国,2019年上映,票房31.71亿', '第9名': '我不是药神,2018年上映,票房31.00亿',
             '第10名': '中国机长,2019年上映,票房29.13亿'})
        for key, value in dict.items():  # 遍历字典,并分别获取到键值
            self.item = QtWidgets.QListWidgetItem(self.listWidget)  # 创建列表项
            self.item.setText(key + ":" + value)  # 设置项文本
            self.item.setToolTip(value)  # 设置提示文字
        self.listWidget.itemClicked.connect(self.gettext)

        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 564, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "设置用户权限"))

    def gettext(self, item):  # 自定义槽函数,获取列表中项的值
        if item.isSelected():  # 判断项是否选中
            from PyQt5.QtWidgets import QMessageBox
            QMessageBox.information(MainWindow, "提示", "您选择的是:" + item.text(), QMessageBox.Ok)

import sys

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

5. 容器控件

      容器控件可以将窗口中的控件进行分组处理,使窗口的分类更清晰,常用的容器控件有GroupBox分组框、TabWidget选项卡和ToolBox工具盒。

1. GroupBox:分组框

Group控件又称为分组控件,主要为其他控件提供分组,并且按照控件的分组来细分窗口的功能。

在这里插入图片描述
      GroupBox控件对应PyQt5中的QGroupBox类。

QGroupBox类的常用方法及说明
方法说明
setAlignment()设置对齐方式,包括水平对齐和垂直对齐两种。
  • 水平对齐方式包括如下4种:
  • Qt.AlignLeft:左对齐;
  • Qt.AlignHCenter:水平居中对齐;
  • Qt.AlignRight:右对齐;
  • Qt.AlignJustify:两端对齐。
  • 垂直对齐方式包括如下3种:
  • Qt.AlignTop:顶部对齐;
  • Qt.AlignVCenter:垂直居中;
  • Qt.AlignBottom:底部对齐。
setTitle()设置分组标题。
setFlat()设置是否以扁平样式显示。

      QGroupBox类最常用的是setTitle()方法,用来设置分组框的标题。例如,下面代码用来为GroupBox控件设置标题“系统登录”:

self.groupBox.setTitle("系统登录")

2. TabWidget:选项卡

      TabWidget控件又称选项卡控件,它主要为其他控件提供分组,并且按照控件的分组来细分窗口的功能。
在这里插入图片描述
      TabWidget控件对应PyQt5中的QTabWidget类。

QTabWidget类的常用方法及说明
方法说明
addTab()添加选项卡
inserTab()插入选项卡
removeTab()删除选项卡
currentWidget()获取当前选项卡
currentIndex()获取当前选项卡的索引
setCurrentIndex()设置当前选项卡的索引
setCurrentWidget()设置当前选项卡
setTabPoistion()设置选项卡的标题位置,支持以下4个位置:
  • QTabWidget.North:标题在北方,即上边,是默认值。
  • QTabWidget.South:标题在南方,即下边。
  • QTabWidget.West:标题在西方,即左边。
  • QTabWidget.East:标题在东方,即右边。
setTabsClosable()设置是否可以独立关闭选项卡,True表示可以关闭,在每个选项卡旁边会有个关闭按钮。
setTabText()设置选项卡标题文本。
tabText()获取指定选项卡的标题文本
setTabPoistion()方法中的4个位置参数效果
参数效果图
QTabWidget.North
QTabWidget.Sourth
QTabWidget.West
QTabWidget.East

      通过将setTabsClosable()方法设置为True可以单独关闭选项卡:

      TabWidget在显示选项卡时,如果默认大小显示不下,会自动生成向前和向后的箭头,用户可以单击箭头查看未显示的选项卡。

      TabWidget控件最常用的信号是currentChanged,该信号在切换选项卡时发射。

示例:选项卡的动态添加和删除

用QT Designer在窗口中添加一个TabWidget控件和两个PushButton控件,其中,TabWidget控件作为选项卡,两个PushButton控件分别执行添加和删除选项卡的操作。保存ui文件,转换为py代码文件。在py文件中定义3个函数,分别实现新增选项卡、删除选项卡和获取选中选项卡及索引的功能。

    # 定义槽函数
    # 新增选项卡
    def addtab(self):
        self.atab = QtWidgets.QWidget()     # 创建选项卡对象
        name = "tab_" + str(self.tabWidget.count() + 1)    # 设置选项卡的对象名
        self.atab.setObjectName(name)    # 设置选项卡的对象名
        self.tabWidget.addTab(self.atab, name)    # 添加选项卡

    # 删除选项卡
    def deltab(self):
        self.tabWidget.removeTab(self.tabWidget.currentIndex())    # 移除当前选项卡

    # 获取选中的选项卡及索引
    def gettab(self, currentIndex):
        from PyQt5.QtWidgets import QMessageBox
        QMessageBox.information(MainWindow, "提示", "您选择了 " + self.tabWidget.tabText(currentIndex) + " 选项卡,索引为:" + str(self.tabWidget.currentIndex()), QMessageBox.Ok)

      分别为“添加”“删除”按钮,以及选项卡的currentChanged信号绑定自定义的槽函数。

        # 将槽函数与信号绑定
        self.pushButton.clicked.connect(self.addtab)    # 为“添加”绑定单击信号
        self.pushButton_2.clicked.connect(self.deltab)   # 为“删除”按钮绑定单击信号
        self.tabWidget.currentChanged.connect(self.gettab)  # 为选项卡绑定页面切换信号

      为.py文件添加__main__主方法,然后运行程序,窗口中默认有两个选项卡,单击“添加”按钮,可以按顺序添加选项卡,单击“删除”按钮,可以删除当前鼠标焦点所在的选项卡。当切换选项卡时,在弹出的提示框中将显示当前选择的选项卡及其索引。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
      当删除某个选项卡时,选项卡会自动切换到前一个,因此也会弹出相应的信息提示。
完整代码如下:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'untitled1.ui'
#
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(564, 391)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
        self.tabWidget.setGeometry(QtCore.QRect(0, 0, 561, 301))
        self.tabWidget.setObjectName("tabWidget")
        self.tab = QtWidgets.QWidget()
        self.tab.setObjectName("tab")
        self.tabWidget.addTab(self.tab, "")
        self.tab_2 = QtWidgets.QWidget()
        self.tab_2.setObjectName("tab_2")
        self.tabWidget.addTab(self.tab_2, "")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(110, 310, 93, 28))
        self.pushButton.setObjectName("pushButton")
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(320, 310, 93, 28))
        self.pushButton_2.setObjectName("pushButton_2")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 564, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        # 将槽函数与信号绑定
        self.pushButton.clicked.connect(self.addtab)    # 为“添加”绑定单击信号
        self.pushButton_2.clicked.connect(self.deltab)   # 为“删除”按钮绑定单击信号
        self.tabWidget.currentChanged.connect(self.gettab)  # 为选项卡绑定页面切换信号

        self.retranslateUi(MainWindow)
        self.tabWidget.setCurrentIndex(0)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "设置用户权限"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "Tab 1"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "Tab 2"))
        self.pushButton.setText(_translate("MainWindow", "添加"))
        self.pushButton_2.setText(_translate("MainWindow", "删除"))

    # 定义槽函数
    # 新增选项卡
    def addtab(self):
        self.atab = QtWidgets.QWidget()     # 创建选项卡对象
        name = "tab_" + str(self.tabWidget.count() + 1)    # 设置选项卡的对象名
        self.atab.setObjectName(name)    # 设置选项卡的对象名
        self.tabWidget.addTab(self.atab, name)    # 添加选项卡

    # 删除选项卡
    def deltab(self):
        self.tabWidget.removeTab(self.tabWidget.currentIndex())    # 移除当前选项卡

    # 获取选中的选项卡及索引
    def gettab(self, currentIndex):
        from PyQt5.QtWidgets import QMessageBox
        QMessageBox.information(MainWindow, "提示", "您选择了 " + self.tabWidget.tabText(currentIndex) + " 选项卡,索引为:" + str(self.tabWidget.currentIndex()), QMessageBox.Ok)


import sys


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

3. ToolBox:工具盒

      主要提供一种列状层叠选项卡。

QToolBox类的常用方法及说明
方法说明
addItem()添加选项卡
setCurrentIndex()设置当前选中的选项卡索引
setItemIcon()设置选项卡的图标
setItemText()设置选项卡的标题文本
setItemEnabled()设置选项卡是否可用
inserItem()插入新选项卡
removeItem()移除选项卡
itemText()获取选项卡的文本
currentIndex()获取当前选项卡的索引

      ToolBox控件最常用的信号是currentChanged,该信号在切换选项卡时发射。

示例:仿QQ抽屉效果

      打开Qt Designer设计器,使用ToolBox控件,并结合ToolButton工具按钮设计一个仿照QQ抽屉效果(一种常用的、能够在有限空间中动态直观地显示更多功能的效果)的窗口。
运行结果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

      完整代码如下:

from PyQt5 import QtCore, QtWidgets
from PyQt5 import QtGui

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        # MainWindow.resize(142, 393)
        MainWindow.resize(200, 393)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        # 创建ToolBox工具盒
        self.toolBox = QtWidgets.QToolBox(self.centralwidget)
        self.toolBox.setGeometry(QtCore.QRect(0, 0, 199, 391))
        self.toolBox.setObjectName("toolBox")
        # 我的好友设置
        self.page = QtWidgets.QWidget()
        self.page.setGeometry(QtCore.QRect(0, 0, 200, 287))
        self.page.setObjectName("page")
        self.toolButton = QtWidgets.QToolButton(self.page)
        self.toolButton.setGeometry(QtCore.QRect(0, 0, 199, 51))
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap("./image/01.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.toolButton.setIcon(icon)
        self.toolButton.setIconSize(QtCore.QSize(96, 96))
        self.toolButton.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon)
        self.toolButton.setAutoRaise(True)
        self.toolButton.setObjectName("toolButton")
        self.toolButton_2 = QtWidgets.QToolButton(self.page)
        self.toolButton_2.setGeometry(QtCore.QRect(0, 49, 199, 51))
        icon1 = QtGui.QIcon()
        icon1.addPixmap(QtGui.QPixmap("./image/02.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.toolButton_2.setIcon(icon1)
        self.toolButton_2.setIconSize(QtCore.QSize(96, 96))
        self.toolButton_2.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon)
        self.toolButton_2.setAutoRaise(True)
        self.toolButton_2.setObjectName("toolButton_2")
        self.toolButton_3 = QtWidgets.QToolButton(self.page)
        self.toolButton_3.setGeometry(QtCore.QRect(0, 103, 199, 51))
        icon2 = QtGui.QIcon()
        icon2.addPixmap(QtGui.QPixmap("./image/03.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.toolButton_3.setIcon(icon2)
        self.toolButton_3.setIconSize(QtCore.QSize(96, 96))
        self.toolButton_3.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon)
        self.toolButton_3.setAutoRaise(True)
        self.toolButton_3.setObjectName("toolButton_3")
        self.toolBox.addItem(self.page, "")
        # 同学设置
        self.page_2 = QtWidgets.QWidget()
        self.page_2.setGeometry(QtCore.QRect(0, 0, 200, 287))
        self.page_2.setObjectName("page_2")
        self.toolButton_4 = QtWidgets.QToolButton(self.page_2)
        self.toolButton_4.setGeometry(QtCore.QRect(0, 0, 199, 51))
        icon3 = QtGui.QIcon()
        icon3.addPixmap(QtGui.QPixmap("./image/04.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.toolButton_4.setIcon(icon3)
        self.toolButton_4.setIconSize(QtCore.QSize(96, 96))
        self.toolButton_4.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon)
        self.toolButton_4.setAutoRaise(True)
        self.toolButton_4.setObjectName("toolButton_4")
        self.toolBox.addItem(self.page_2, "")
        # 同事设置
        self.page_3 = QtWidgets.QWidget()
        self.page_3.setObjectName("page_3")
        self.toolButton_5 = QtWidgets.QToolButton(self.page_3)
        self.toolButton_5.setGeometry(QtCore.QRect(0, 1, 199, 51))
        icon4 = QtGui.QIcon()
        icon4.addPixmap(QtGui.QPixmap("./image/05.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.toolButton_5.setIcon(icon4)
        self.toolButton_5.setIconSize(QtCore.QSize(96, 96))
        self.toolButton_5.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon)
        self.toolButton_5.setAutoRaise(True)
        self.toolButton_5.setObjectName("tooButton_5")
        self.toolButton_6 = QtWidgets.QToolButton()
        self.toolButton_6.setGeometry(QtCore.QRect(0, 50, 199, 51))
        icon5 = QtGui.QIcon()
        icon5.addPixmap(QtGui.QPixmap("./image/06.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.toolButton_6.setIcon(icon5)
        self.toolButton_6.setIconSize(QtCore.QSize(96, 96))
        self.toolButton_6.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon)
        self.toolButton_6.setAutoRaise(True)
        self.toolButton_6.setObjectName("toolButton_6")
        self.toolBox.addItem(self.page_3, "")
        # 陌生人设置
        self.page_4 = QtWidgets.QWidget()
        self.page_4.setObjectName("page_4")
        self.toolButton_7 = QtWidgets.QToolButton(self.page_4)
        self.toolButton_7.setGeometry(QtCore.QRect(0, 7, 199, 51))
        icon6 = QtGui.QIcon()
        icon6.addPixmap(QtGui.QPixmap("./image/07.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.toolButton_7.setIcon(icon6)
        self.toolButton_7.setIconSize(QtCore.QSize(96, 96))
        self.toolButton_7.setToolButtonStyle(QtCore.Qt.ToolButtonTextBesideIcon)
        self.toolButton_7.setAutoRaise(True)
        self.toolButton_7.setObjectName("toolButton_7")
        self.toolBox.addItem(self.page_4, "")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        self.toolBox.setCurrentIndex(0)   # 默认选择第一个页面,即我的好友
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "我的QQ"))
        self.toolButton.setText(_translate("MainWindow", "及时雨 宋江"))
        self.toolButton_2.setText(_translate("MainWindow", "玉麒麟 卢俊义"))
        self.toolButton_3.setText(_translate("MainWindow", "智多星 吴用"))
        self.toolBox.setItemText(self.toolBox.indexOf(self.page), _translate("MainWindow", "我的好友"))
        self.toolButton_4.setText(_translate("MainWindow", "豹子头 林冲"))
        self.toolBox.setItemText(self.toolBox.indexOf(self.page_2), _translate("MainWindow", "同学"))
        self.toolButton_5.setText(_translate("MainWindow", "花和尚 鲁智深"))
        self.toolButton_6.setText(_translate("MainWindow", "行者 武松"))
        self.toolBox.setItemText(self.toolBox.indexOf(self.page_3), _translate("MainWindow", "同事"))
        self.toolButton_7.setText(_translate("MainWindow", "方腊"))
        self.toolBox.setItemText(self.toolBox.indexOf(self.page_4), _translate("MainWindow", "陌生人"))


import sys
# 主方法,程序从此处启动PyQt窗体


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

6. 日期时间类控件

      日期时间类控件主要是对日期、时间等信息进行编辑、选择或者显示,PyQt5中提供了Date/TimeEdit、DateEdit、TimeEdit和CalendarWidget 4个相关的控件。

1. 日期和(或)时间控件

      PyQt5提供了3个日期时间控件,分别是Date/TimeEdit控件、DateEdit控件和TimeEdit控件。
      Date/TimeEdit控件对应的类是QDateTimeEdit,该控件可以同时显示和编辑日期时间。DateEdit控件对应的类是QDateEdit,它是QDateTimeEdit子类,只能显示和编辑日期。TimeEdit控件对应的类是QTimeEdit,它是QDateTimeEdit子类,只能显示和编辑时间
在这里插入图片描述

QDateTimeEdit类的常用方法及说明
方法说明
setTime()设置时间,默认为0:00:00
setMaximunTime()设置最大时间,默认为23:59:59
setMinimunTime()设置最小时间,默认为0:00:00
setTimeSpec()获取显示的时间标准,支持以下4种值:
  • LocalTime:本地时间;
  • UTC:世界标准时间;
  • OffsetFromUTC:与UTC等效的时间;
  • TimeZone:时区
setDateTime()设置日期时间,默认为2000/1/1 0:00:00
setDate()设置日期,默认为2000/1/1
setMaximunDate()设置最大日期,默认为9999/12/31
setMinimunDate()设置最小日期,默认为1752/9/14
setDisplayFormat()设置日期、时间的显示样式:
  • 日期样式(yyyy表示4位数年份,MM表示2位数月份,dd表示2位数日):
  • yyyy/MM/dd、yyyy/M/d、yy/M/d、yy/MM和MM/dd
  • 时间样式(HH表示2位数小时,mm表示2位数分钟,ss表示2位数秒钟):
  • HH:mm:ss、HH:mm、mm:ss、H:m和m:s
date()获取显示的日期,返回值为QDate类型,如QDate(2000, 1, 1)
time()获取显示的时间,返回值为QTime类型,如QTime(0, 0)
dateTime()获取显示的日期时间,返回值为QDateTime类型,如QDateTime(2000, 1, 1, 0, 0)

      由于QDateEdit和QTimeEdit都是从QDateTimeEdit继承而来的,因此,他们都拥有QDateTimeEdit类的所有公共方法。

QDateTimeEdit类的常用信号及说明
信号说明
timeChanged时间发生改变时发射
dateChanged日期发生改变时发射
dateTimeChanged日期或者时间发生改变时发射

      在Qt Designer设计器的窗口中分别添加一个Date/TimeEdit控件、一个DateEdit控件和一个TimeEdit控件。
      由于date()、time()和dateTime()方法的返回值分别是QDate类型、QTime类型和QDateTime类型,无法直接使用,因此如果想要获取日期时间控件中的具体日期和(或)时间值,可以使用text()方法获取。

self.dateTimeEdit.text()
示例:时间日期控件的使用

      使用日期时间控件时,如果要改变日期时间,默认只能通过上下箭头来改变,如果想弹出日历控件,设置**setCalendarPoput(True)**即可。
在这里插入图片描述
完整代码如下:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'untitled1.ui'
#
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(352, 233)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.dateTimeEdit = QtWidgets.QDateTimeEdit(self.centralwidget)
        self.dateTimeEdit.setGeometry(QtCore.QRect(40, 30, 194, 22))
        self.dateTimeEdit.setObjectName("dateTimeEdit")
        self.dateEdit = QtWidgets.QDateEdit(self.centralwidget)
        self.dateEdit.setGeometry(QtCore.QRect(40, 70, 110, 22))
        self.dateEdit.setObjectName("dateEdit")
        self.timeEdit = QtWidgets.QTimeEdit(self.centralwidget)
        self.timeEdit.setGeometry(QtCore.QRect(40, 110, 118, 22))
        self.timeEdit.setObjectName("timeEdit")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 352, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))

import sys


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

2. CalendarWidget:日历控件

      CalendarWidget控件又称为日历控件,主要用来显示和选择日期。
在这里插入图片描述

      CalendarWidget控件对应PyQt5中的QCalendarWidget类。

QcalendarWidget类的常用方法及说明
方法说明
setSelectDate()设置选中的日期,默认为当前日期
setMinimumDate()设置最小日期,默认为1752/9/14
setMaximumDate()设置最大日期,默认为9999/12/31
setFirstDayOfWeek()
  • 设置一周的第一天:
  • Qt.Monday:星期一;
  • Qt.Tuesday:星期二;
  • Qt.Wednesday:星期三;
  • Qt.Thursday:星期四;
  • Qt.Friday:星期五;
  • Qt.Saturday:星期六;
  • Qt.Sunday:星期日
setGridVisible()设置是否显示网格线
setSelectionMode()
  • 设置选择模式:
  • QCalendarWidget.NoSelection:不能选中日期。
  • QCalendarWidget.SingleSelection:可以选中一个日期。
setHorizontalHeaderFormat()
  • 设置水平头部格式:
  • QCalendarWidget.NoHorizontalHeader:不显示水平头部;
  • QCalendarWidget.SingleLetterDayNames:“周”;
  • QCalendarWidget.ShortDayNames:简短天的名称,如“周一”;
  • QCalendarWidget.LongDayNames:完整的天的名称,如“星期一”。
setVerticalHeaderFormat()
  • 设置对齐方式,有水平和垂直两种:
  • QCalendarWidget.NoVerticalHeader:不显示垂直头部;
  • QCalendarWidget.ISOWeekNumbers:以星期数字显示垂直头部。
setNavigationBarVisible()设置是否显示导航栏
setDateEditEnabled()设置是否可以编辑日期
setDateEditAcceptDelay()设置编辑日期的最长间隔,默认为1500
selectedDate()获取选择的日期,返回值为Qdate类型

       CalendarWidget控件最常用的信号是selectionChanged,该信号在选择的日期发生改变时发射。

示例:获取选中的日期

       在Qt Designer设计器中创建一个窗口,在窗口中添加一个CalendarWidget控件,设计完成后保存为.ui文件,并使用PyUIC工具将其转换为.py代码文件。在.py代码文件中自定义一个getdate()方法,用来获取CalendarWidget控件中选中的日期,并转换为“年-月-日”形式,显示在弹出的提示框中。

def getdate(self):
	from PyQt5.QtWidgets import QMessageBox
	date = QtCore.QDate(self.calendarWidget.selectedDate())    # 获取当前选中日期的QDate对象
	year = date.year()           # 获取年份
	month = date.month()        # 获取月份
	day = date.day()          # 获取日
	QMessageBox.information(MainWindow, "提示", str(year) + "-" + str(month) + "-" + str(day), QMessageBox.Ok)

       对CalendarWidget控件进行设置,并为其selectionChanged信号绑定自定义的getdate()槽函数。

self.calendarWidget = QtWidgets.QCalendarWidget(self.centralwidget)
self.calendarWidget.setGeometry(QtCore.QRect(20, 10, 248, 197))
self.calendarWidget.setSelectedDate(QtCore.QDate(2020, 3, 23))    # 设置默认选中的日期
self.calendarWidget.setMinimumDate(QtCore.QDate(1752, 9, 14))    # 设置最小日期
self.calendarWidget.setMaxmumDate(QtCore.QDate(9999, 12, 31))    # 设置最大日期
self.calendarWidget.setFirstDayOfWeek(QtCore.Qt.Monday)    # 设置每周第一天为星期一
self.calendarWidget.setGridVisible(True)    # 设置网格线可见
# 设置可以选中单个日期
self.calendarWidget.setSelectionMode(QtWidgets.QCalendarWidget.SingleSelection)
# 设置水平表头为简短形式,即“周一”形式
self.calendarWidget.setHorizontalHeaderFormat(QtWidgets.QCalendarWidget.ShortDayNames)
# 设置垂直表头为周数
self.calendarWidget.setVerticalHeaderFormat(QtWidgets.QCalendarWidget.ISOWeekNumbers)
self.calendarWidget.setNavigationBarVisible(True)    # 设置显示导航栏
self.calendarWidget.setDateEditEnabled(True)    # 设置日期可以编辑
self.calendarWidget.setObjectName("calendarWidget")
# 选中日期变化时显示选择的日期
self.calendarWidget.selectionChanged.connect(self.getdate)

       为.py文件添加__main__主方法,然后运行程序,日期控件在窗口中的显示效果如图9.70所示,单击某个日期时,可以弹出对话框进行显示。
运行结果如下:
在这里插入图片描述
在这里插入图片描述
完整代码如下:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'untitled1.ui'
#
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(404, 325)

        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.calendarWidget = QtWidgets.QCalendarWidget(self.centralwidget)
        self.calendarWidget.setGeometry(QtCore.QRect(50, 20, 296, 218))
        self.calendarWidget.setObjectName("calendarWidget")
        self.calendarWidget.setMaximumDate(QtCore.QDate(2020, 3, 23))   # 设置最小日期
        self.calendarWidget.setMaximumDate(QtCore.QDate(9999, 12, 31))   # 设置最大日期
        self.calendarWidget.setFirstDayOfWeek(QtCore.Qt.Monday)    # 设置每周第一天为为星期一
        self.calendarWidget.setGridVisible(True)  # 设置网格线可见
        # 设置可以选中单个日期
        self.calendarWidget.setSelectionMode(QtWidgets.QCalendarWidget.SingleSelection)
        # 设置水平表头为简短形式,即“周一”形式
        self.calendarWidget.setHorizontalHeaderFormat(QtWidgets.QCalendarWidget.ShortDayNames)
        # 设置垂直表头为周数
        self.calendarWidget.setVerticalHeaderFormat(QtWidgets.QCalendarWidget.ISOWeekNumbers)
        self.calendarWidget.setNavigationBarVisible(True)  # 设置显示导航栏
        self.calendarWidget.setDateEditEnabled(True)  # 设置日期可以编辑
        self.calendarWidget.setObjectName("calendarWidget")
        # 选中日期变化时显示选择的日期
        self.calendarWidget.selectionChanged.connect(self.getdate)

        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 404, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
		
		datetime = QtCore.QDateTime.currentDateTime()  # 获取当前系统日期时间
        print("系统当前日期时间:", datetime)
        date = QtCore.QDate.currentDate()     # 获取当前日期
        print("系统当前日期:", date)
        time = QtCore.QTime.currentTime()    # 获取当前时间
        print("系统当前时间:", time)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))

    def getdate(self):
        from PyQt5.QtWidgets import QMessageBox
        date = QtCore.QDate(self.calendarWidget.selectedDate())    # 获取当前选中日期的QDate对象
        year = date.year()             # 获取年份
        month = date.month()          # 获取月份
        day = date.day()          # 获取日
        QMessageBox.information(MainWindow, "提示", str(year) + "-" + str(month) + "-" + str(day), QMessageBox.Ok)


import sys


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

       在PyQt5中,如果要获取当前系统的日期时间,可以借助QtCore模块下的QDateTime类、QDate类或者QTime类实现。其中,获取当前系统的日期时间可以使用QDateTime类的currentDateTime()方法,获取当前系统的日期可以使用QDate类的currentDate()方法,获取当前系统的时间可以使用QTime类的currentTime()方法。

		datetime = QtCore.QDateTime.currentDateTime()  # 获取当前系统日期时间
        print("系统当前日期时间:", datetime)
        date = QtCore.QDate.currentDate()     # 获取当前日期
        print("系统当前日期:", date)
        time = QtCore.QTime.currentTime()    # 获取当前时间
        print("系统当前时间:", time)

在这里插入图片描述

(二)PyQt布局管理

      前面设计的窗口程序都是绝对布局,即在Qt Designer窗口中,将控件放到窗口中的指定位置上,那么该控件的大小和位置就会固定在初始放置的位置。除了绝对布局,PyQt5还提供了一些常用的布局方式,如垂直布局、水平布局、网格布局、表单布局等。

1. 线性布局

      线性布局是将放入其中的组件按照垂直或水平方向来布局,也就是控制放入其中的组件横向排列或纵向排列。
      将纵向排列的称为垂直线性布局管理器,用VerticalLayout控件表示,其基类为QVBoxLayout。
      垂直线性布局管理器:
在这里插入图片描述
在这里插入图片描述
      将横向排列的称为水平线性布局管理器,用HorizontalLayout控件表示,其基类为QHBoxLayout。
水平线性布局管理器:
在这里插入图片描述
在这里插入图片描述
      在垂直线性布局管理器中,每一行只能放一个组件;在水平线性布局管理器中,每一列只能放一个组件。

1. VerticalLayout:垂直布局

      VerticalLayout控件表示垂直布局,其基类是QVBoxLayout,它的特点是:放入该布局管理器中的控件默认垂直排列。

示例:VerticalLayout控件的使用

      在PyQt5的设计窗口中添加了一个VerticalLayout控件,并在其中添加4个PushButton控件。

# 垂直布局
vlayout = QVBoxLayout()
btn1 = QPushButton()
btn1.setText("按钮1")
btn2 = QPushButton()
btn2.setText("按钮2")
btn3 = QPushButton()
btn3.setText("按钮3")
btn4 = QPushButton()
btn4.setText("按钮4")
vlayout.addWidget(btn1)
vlayout.addWidget(btn2)
vlayout.addWidget(btn3)
vlayout.addWidget(btn4)
vlayout.addSpacing(10)   # 设置两个控件之间的间距为10
self.setLayout(vlayout)

      在向垂直布局管理器中添加控件时,用到了addWidget()方法,除此之外,垂直布局管理器中还有一个常用的方法——addSpacing(),用来设置控件的上下间距

addSpacing(self, int)    # 参数int表示要设置的间距值

运行效果对比:
在这里插入图片描述
完整代码如下:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'untitled1.ui'
#
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(164, 274)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayoutWidget = QtWidgets.QWidget(self.centralwidget)
        self.verticalLayoutWidget.setGeometry(QtCore.QRect(20, 0, 121, 241))
        self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)    # 定义垂直布局管理器
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setObjectName("verticalLayout")

        self.pushButton_2 = QtWidgets.QPushButton(self.verticalLayoutWidget)
        self.pushButton_2.setObjectName("pushButton_2")
        self.verticalLayout.addWidget(self.pushButton_2)     # 向垂直布局管理器添加按钮控件
        # 设置控件上下间距
        self.verticalLayout.addSpacing(20)

        self.pushButton_3 = QtWidgets.QPushButton(self.verticalLayoutWidget)
        self.pushButton_3.setObjectName("pushButton_3")
        self.verticalLayout.addWidget(self.pushButton_3)

        self.pushButton_4 = QtWidgets.QPushButton(self.verticalLayoutWidget)
        self.pushButton_4.setObjectName("pushButton_4")
        self.verticalLayout.addWidget(self.pushButton_4)

        self.pushButton = QtWidgets.QPushButton(self.verticalLayoutWidget)
        self.pushButton.setObjectName("pushButton")
        self.verticalLayout.addWidget(self.pushButton)

        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 164, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "垂直布局"))
        self.pushButton_2.setText(_translate("MainWindow", "按钮1"))
        self.pushButton_3.setText(_translate("MainWindow", "按钮2"))
        self.pushButton_4.setText(_translate("MainWindow", "按钮3"))
        self.pushButton.setText(_translate("MainWindow", "按钮4"))

import sys


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

      在使用addWidget()方法向布局管理器中添加控件时,还可以指定控件的伸缩量和对其方式:

addWidget(self, QWidget, stretch, alignment)
# QWidget表示要添加的控件
# stretch表示控件的伸缩量,设置该伸缩量之后,控件会随着窗口的变化而变化
# alignment用来指定控件的对齐方式
控件对齐方式的取值及说明
说明说明
Qt.AlignLeft水平左对齐Qt.AlignTop垂直靠上对齐
Qt.AlignRight水平右对齐Qt.AlignBottom垂直靠下对齐
Qt.AlignCenter水平居中对齐Qt.AlignVCenter垂直居中对齐
Qt.AlignJustify水平两端对齐

      例如,向垂直布局管理器中添加一个名称为btn1,伸缩量为1,对齐方式为垂直居中对齐的按钮:

vlayout.addWidget(btn1, 1, QtCore.Qt.AlignVCenter)

2. HorizontalLayout:水平布局

      HorizontalLayout控件表示水平布局,其基类是QHBoxLayout,它的特点是:放入该布局管理器中的控件默认水平排列。

示例:HorizontalLayout控件的使用

      PyQt5的设计窗口中添加了一个HorizontalLayout控件,并在其中添加了4个PushButton控件。

# 水平布局
hlayout = QHBoxLayout()
btn1 = QPushButton()
btn1.setText("按钮1")
btn1 = QPushButton()
btn1.setText("按钮2")
btn1 = QPushButton()
btn1.setText("按钮3")
btn1 = QPushButton()
btn1.setText("按钮4")
hlayout.addWidget(btn1)
hlayout.addWidget(btn2)
hlayout.addWidget(btn3)
hlayout.addWidget(btn4)
self.setLayout(hlayout)

      水平布局管理器还有两个常用的方法:addSpacing()方法addStretch()方法
      其中,addSpacing()方法用于设置控件的左右间距:

addSpacing(self, int)    # 参数int表示要设置的间距值

      例如,将第一个按钮和第二个按钮之间的间距设为20,:

hlayout.addSpacing(20)   # 设置两个控件之间的间距

      addStretch()方法用来增加一个可伸缩的控件,并且将伸缩量添加到布局末尾。

addStretch(self, stretch)   # 参数stretch表示要均分的比例,默认值为0

      例如,下面代码在水平布局管理器的第一个按钮之前增加一个水平伸缩量:

hlayout.addStretch(1)

运行效果对比:
在这里插入图片描述
在每个按钮之前添加一个伸缩量:

在这里插入图片描述
完整代码如下:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'untitled1.ui'
#
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(457, 86)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.horizontalLayoutWidget = QtWidgets.QWidget(self.centralwidget)
        self.horizontalLayoutWidget.setGeometry(QtCore.QRect(10, 0, 441, 41))
        self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget)
        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout.setObjectName("horizontalLayout")

        # # 在第一个按钮之前增加一个水平伸缩量
        # self.horizontalLayout.addStretch(2)

        # 在每一个按钮之前增加一个水平伸缩量
        self.horizontalLayout.addStretch(2)

        self.pushButton_2 = QtWidgets.QPushButton(self.horizontalLayoutWidget)
        self.pushButton_2.setObjectName("pushButton_2")
        self.horizontalLayout.addWidget(self.pushButton_2)

        # # 设置按钮1和按钮2之间的间距
        # self.horizontalLayout.addSpacing(20)

        # 在每一个按钮之前增加一个水平伸缩量
        self.horizontalLayout.addStretch(2)

        self.pushButton = QtWidgets.QPushButton(self.horizontalLayoutWidget)
        self.pushButton.setObjectName("pushButton")
        self.horizontalLayout.addWidget(self.pushButton)

        # 在每一个按钮之前增加一个水平伸缩量
        self.horizontalLayout.addStretch(2)

        self.pushButton_4 = QtWidgets.QPushButton(self.horizontalLayoutWidget)
        self.pushButton_4.setObjectName("pushButton_4")
        self.horizontalLayout.addWidget(self.pushButton_4)

        # 在每一个按钮之前增加一个水平伸缩量
        self.horizontalLayout.addStretch(2)

        self.pushButton_3 = QtWidgets.QPushButton(self.horizontalLayoutWidget)
        self.pushButton_3.setObjectName("pushButton_3")
        self.horizontalLayout.addWidget(self.pushButton_3)

        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 457, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton_2.setText(_translate("MainWindow", "按钮1"))
        self.pushButton.setText(_translate("MainWindow", "按钮2"))
        self.pushButton_4.setText(_translate("MainWindow", "按钮3"))
        self.pushButton_3.setText(_translate("MainWindow", "按钮4"))


import sys


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

2. GridLayout:网格布局

      GridLayout被称为网格布局(多行多列),它将位于其中的控件放入一个网格中。GridLayout需要将提供给它的空间划分成行和列,并把每个控件插入正确的单元格中。
在这里插入图片描述

1. 网格布局的基本使用

      网格控件的基类是QGridLayout。

网格控件的常用方法及说明
方法说明
addWidget(QWidget widget, int row, int column, QtAlignment alignment)
  • 添加控件,主要参数说明:
  • widget:要添加的控件;
  • row:添加控件的行数;
  • column:添加控件的列数;
  • alignment:控件的对齐方式。
addWidget(QWidget widget, int fromRow, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt.Alignment.alignment)
  • 跨行和列添加控件,主要参数说明:
  • widget:要添加的控件;
  • fromRow:添加控件的起始行数;
  • fromColumn:添加控件的起始列数;
  • rowSpan:控件跨越的行数;
  • columnSpan:控件跨越的列数;
  • alignment:控件的对齐方式。
    setRowStretch()设置行比例
    setColumnStretch()设置列比例
    setSpacing()设置控件在水平和垂直方向上的间距
    示例:使用网格布局登录窗口

          创建一个.py文件,首先导入PyQt5窗口程序开发所需的模块,定义一个类,继承自QWidget,该类中定义一个initUI方法,用来使用GridLayout网格布局一个登录窗口;定义完成之后,在__init__方法中调用,对窗口进行初始化;最后在__main__方法中显示创建的登录窗口。
    运行结果:
    在这里插入图片描述
    完整代码:

    from PyQt5 import QtCore
    from PyQt5.QtWidgets import *
    
    
    class Demo(QWidget):
        def __init__(self, parent=None):
            super(Demo, self).__init__(parent)
            self.initUi()    # 初始化窗口
    
        def initUi(self):
            grid = QGridLayout()   # 创建网格布局
            # 创建并设置标签文本
            label1 = QLabel()
            label1.setText("用户名:")
            # 创建输入文本框
            text1 = QLineEdit()
            # 创建并设置标签文本
            label2 = QLabel()
            label2.setText("密 码:")
            # 创建输入文本框
            text2 = QLineEdit()
            # 创建“登录”和“取消”按钮
            btn1 = QPushButton()
            btn1.setText("登录")
            btn2 = QPushButton()
            btn2.setText("取消")
            # 在第一行第一列添加标签控件,并设置左对齐
            grid.addWidget(label1, 0, 0, QtCore.Qt.AlignLeft)
            # 在第一行第二列添加输入文本框控件,并设置左对齐
            grid.addWidget(text1, 0, 1, QtCore.Qt.AlignLeft)
            # 在第二行第一列添加标签控件,并设置左对齐
            grid.addWidget(label2, 1, 0, QtCore.Qt.AlignLeft)
            # 在第二行第二列添加输入文本框控件,并设置左对齐
            grid.addWidget(text2, 1, 1, QtCore.Qt.AlignLeft)
            # 在第三行第一列添加按钮控件,并设置居中对齐
            grid.addWidget(btn1, 2, 0, QtCore.Qt.AlignCenter)
            # 在第三行第二列添加按钮控件,并设置居中对齐
            grid.addWidget(btn2, 2, 1, QtCore.Qt.AlignCenter)
            # 设置网格布局
            self.setLayout(grid)
    
    
    if __name__ == "__main__":
        import sys
        app = QApplication(sys.argv)   # 创建窗口程序
        demo = Demo()    # 创建窗口类对象
        demo.show()   # 显示窗口
        sys.exit(app.exec_())
    

    2. 跨越行和列的网格布局

          使用网格布局时,除了普通的按行、列进行布局,还可以跨行、列进行布局,实现该功能,需要使用addWidget()方法的以下形式:

    addWidget(QWidget widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt.Alignment alignment)
    # widget:要添加的控件
    # fromRow:添加控件的起始行数
    # fromColumn:添加控件的起始列数
    # rowSpan:控件跨越的行数
    # columnSpan:控件跨越的列数
    # alignment:控件的对齐方式
    
    示例:跨行布局QQ登录窗口

          创建一个.py文件,首先导入PyQt5窗口程序开发所需的模块,然后通过在网格布局中跨行和列布局一个QQ登录窗口。
    完整代码如下:

    from PyQt5 import QtCore, QtGui, QtWidgets
    from PyQt5.QtWidgets import *
    
    
    class Demo(QWidget):
        def __init__(self, parent=None):
            super(Demo, self).__init__(parent)
            self.initUi()   # 初始化窗口
        def initUi(self):
            self.setWindowTitle("QQ 登录窗口")
            grid = QGridLayout()    # 创建网格布局
            # 创建顶部图片
            label1 = QLabel()
            label1.setPixmap(QtGui.QPixmap("image/top.png"))
            # 创建并设置用户名标签文本
            label2 = QLabel()
            label2.setPixmap(QtGui.QPixmap("image/qq1.png"))
            # 创建用户名输入文本框
            text1 = QLineEdit()
            # 创建并设置标签文本
            label3 = QLabel()
            label3.setPixmap(QtGui.QPixmap("image/qq2.png"))
            # 创建输入文本框
            text2 = QLineEdit()
            # 创建“安全登录”按钮
            btn1 = QPushButton()
            btn1.setText("安全登录")
            # 在第一行第一列到第三行第四列添加标签控件,并设置居中对齐
            grid.addWidget(label1, 0, 0, 3, 4, QtCore.Qt.AlignCenter)
            # 在第四行第二列添加标签控件,并设置右对齐
            grid.addWidget(label2, 3, 1, QtCore.Qt.AlignRight)
            # 在第四行第三列添加输入文本框控件,并设置左对齐
            grid.addWidget(text1, 3, 2, QtCore.Qt.AlignLeft)
            # 在第五行第二列添加标签控件,并设置右对齐
            grid.addWidget(label3, 4, 1, QtCore.Qt.AlignRight)
            # 在第五行第三列添加输入文本框控件,并设置左对齐
            grid.addWidget(text2, 4, 2, QtCore.Qt.AlignLeft)
            # 在第六行第二列到第三列添加按钮控件,并设置居中对齐
            grid.addWidget(btn1, 5, 1, 1, 2, QtCore.Qt.AlignCenter)
            self.setLayout(grid)    # 设置网格布局
    
    
    if __name__ == "__main__":
        import sys
        app = QApplication(sys.argv)    # 创建窗口程序
        demo = Demo()      # 创建窗口类对象
        demo.show()      # 显示窗口
        sys.exit(app.exec_())
    

    运行结果如下:
    在这里插入图片描述
          当窗口中的控件布局比较复杂时,应该尽量使用网格布局,而不是使用水平和垂直布局的组合或者嵌套的形式,因为在多数情况下,后者往往会更加复杂而难以控制。网格布局使得窗口设计器能够以更大的自由度来排列组合控件,而仅仅带来了微小的复杂度开销。

    3. FormatLayout:表单布局

          FormLayout控件表示表单布局,它的基类是QFormLayout,该控件以表单方式进行布局。
          表单是一种网页中常见的与用户交互的方式,其主要由两列组成,第一列用来显示信息,给用户提示,而第二列需要用户进行输入或者选择,下图所示的IT教育类网站——明日学院的登录窗口就是一种典型的表单布局
    在这里插入图片描述
          表单布局最常用的方式是addRow()方法,该方法用来向表单布局中添加一行,在一行中可以添加两个控件,分别位于一行中的两列上。

    addRow(self, __args)
    # 参数__args表示要添加的控件,通常是两个控件对象。
    

    示例:使用表单布局登录窗口

          创建一个.py文件,使用表单布局实现前面网格布局登录窗口类似的功能,布局一个通用的登录窗口。
    完整代码如下:

    from PyQt5 import QtWidgets, QtCore, QtGui
    from PyQt5.QtWidgets import *
    
    
    class Demo(QWidget):
        def __init__(self, parent=None):
            super(Demo, self).__init__(parent)
            self.initUI()   # 初始化窗口
    
        def initUI(self):
            form = QFormLayout()    # 创建表单布局
            # 创建并设置标签文本
            label1 = QLabel()
            label1.setText("用户名:")
            # 创建输入文本框
            text1 = QLineEdit()
            # 创建并设置标签文本
            label2 = QLabel()
            label2.setText("密 码:")
            # 创建输入文本框
            text2 = QLineEdit()
            # 创建“登录”和“取消”按钮
            btn1 = QPushButton()
            btn1.setText("登录")
            btn2 = QPushButton()
            btn2.setText("取消")
            # 设置标签总在文本框的上方
            form.setRowWrapPolicy(QtWidgets.QFormLayout.WrapAllRows)
            # 将上面创建的6个控件分为3行添加到表单布局中
            form.addRow(label1, text1)
            form.addRow(label2, text2)
            form.addRow(btn1, btn2)
            # form.addRow(btn1)
            # form.addRow(btn2)
    
            self.setLayout(form)   # 设置表单布局
    
    
    if __name__ == "__main__":
        import sys
        app =QApplication(sys.argv)    # 创建窗口程序
        demo = Demo()
        demo.show()    # 显示窗口
        sys.exit(app.exec_())
    

    运行结果如下:
    在这里插入图片描述
          表单布局还提供了一个setRowWrapPolicy()方法,用来设置表单布局中的每一列的摆放方式:

    setRowWrapPolicy(RowWrapPolicy policy)
    

    setRowWrapPolicy(RowWrapPolicy policy)方法中参数policy的取值及说明

    取值说明
    QFormLayout.DontWrapRows文本框总是出现在标签的后面,其中标签被赋予足够的水平空间以适应表单中出现的最宽的标签,其余的空间被赋予文本框。
    QFormLayout.DrapLongRows适用于小屏幕,当标签和文本在在屏幕的当前行显示不全时,文本框会显示在下一行,使得标签独占一行。
    QFormLayout.WrapAllRows标签总是在文本框的上一行

    如果在示例中加入如下代码:

    # 设置标签总在文本框的上方
    form.setRowWrapPolicy(QtWidgets.QFormLayout.WrapAllRows)
    

    在这里插入图片描述

          由于表单布局中的最后一行是两个按钮,但设置标签总在文本框上方后,默认第二列会作为一个文本框填充整个布局,所以就出现了“取消”按钮比“登录”按钮长的情况,想改变这种情况,可以在使用addRow()方法添加按钮时,一行只添加一个按钮控件。

    # 原本的代码:
    form.addRow(btn1, btn2)
    # 改为如下的代码:
    form.addRow(btn1)
    form.addRow(btn2)
    

    在这里插入图片描述

    再次运行程序,效果如下:
    在这里插入图片描述

          当要设计的窗口是一种类似于两列和若干行组成的形式时,使用表单布局要比网格布局更方便。

    4. 布局管理器的嵌套

          在进行用户界面设计时,很多时候只通过一种布局管理器很难实现想要的界面效果,这时就需要将多种布局管理器混合使用,即布局管理器的嵌套。

    1. 嵌套布局的基本使用

          多种布局管理器之间可以互相嵌套。

    实现布局管理器嵌套时需要记住的规则
    1. 在一个布局文件中,最多只能有一个顶层布局管理器。如果想要使用多个布局管理器,就需要使用一个根布局管理器将它们包括起来。
    2. 不能嵌套太深。如果嵌套太深,则会影响性能,主要会降低页面的加载速度。
    示例:在登录界面中添加密码输入提示

          在上一示例中使用表单布局制作了一个登录窗口,但表单布局的默认两列中只能添加一个控件,现在需要在“密码”文本框下方提示“密码只能输入8位”,这时单纯使用表单布局是无法实现的。我们可以在“密码”文本框的列中嵌套一个垂直布局管理器,在其中添加一个输入密码的文本框和一个用于提示的标签,这样就可以实现想要的功能。
          完整代码如下:

    from PyQt5 import QtWidgets, QtCore, QtGui
    from PyQt5.QtWidgets import *
    
    
    class Demo(QWidget):
        def __init__(self, parent=None):
            super(Demo, self).__init__(parent)
            self.initUI()   # 初始化窗口
    
        def initUI(self):
            form = QFormLayout()    # 创建表单布局
            # 创建并设置标签文本
            label1 = QLabel()
            label1.setText("用户名:")
            # 创建输入文本框
            text1 = QLineEdit()
            # 创建并设置标签文本
            label2 = QLabel()
            label2.setText("密 码:")
            # 创建输入文本框
            text2 = QLineEdit()
            # 创建“登录”和“取消”按钮
            btn1 = QPushButton()
            btn1.setText("登录")
            btn2 = QPushButton()
            btn2.setText("取消")
            # 将上面创建的6个控件分为3行添加到表单布局中
            form.addRow(label1, text1)
            
            vlayout = QVBoxLayout()      # 创建垂直布局管理器
            vlayout.addWidget(text2)      # 向垂直布局中添加密码输入框
            vlayout.addWidget(QLabel("密码只能输入8位"))   # 向垂直布局中添加提示标签
            form.addRow(label2, vlayout)     # 将垂直布局嵌套进表单布局中
            
            form.addRow(btn1, btn2)
            
            self.setLayout(form)   # 设置表单布局
    
    
    if __name__ == "__main__":
        import sys
        app =QApplication(sys.argv)    # 创建窗口程序
        demo = Demo()
        demo.show()    # 显示窗口
        sys.exit(app.exec_())
    

    运行结果:
    在这里插入图片描述

    2. 通过嵌套布局设计一个微信聊天窗口

          创建一个.py文件,通过在GirdLayout网格布局中嵌套垂直布局,设计一个微信聊天窗口,该窗口主要模拟两个人的对话,并且在窗口下方显示输入框及“发送”按钮。
    完整代码如下:

    from PyQt5 import QtCore, QtGui
    from PyQt5.QtWidgets import *
    
    
    class Demo(QWidget):
        def __init__(self, parent=None):
            super(Demo, self).__init__(parent)
            self.initUi()       # 初始化窗口
        def initUi(self):
            self.setWindowTitle("微信交流")
            grid = QGridLayout()    # 创建网格布局
            # 创建顶部时间栏
            label1 = QLabel()
            # 显示当前日期时间
            label1.setText(QtCore.QDateTime.currentDateTime().toString("yyyy-MM-dd HH:mm:ss"))
            # 在第一行第一列到第一行第四列添加标签控件,并设置居中对齐
            grid.addWidget(label1, 0, 0, 1, 4, QtCore.Qt.AlignCenter)
            # 创建对方用户头像,昵称及信息,并在网格中嵌套垂直布局显示
            label2 = QLabel()
            label2.setPixmap(QtGui.QPixmap("image/head1.png"))
            vlayout1 = QVBoxLayout()
            vlayout1.addWidget(QLabel("老妈"))
            vlayout1.addWidget(QLabel("儿子,在不在,最近还好吗?"))
            grid.addWidget(label2, 1, 0, QtCore.Qt.AlignRight)
            grid.addLayout(vlayout1, 1, 1)
            # 创建自己的头像、昵称及信息,并在网格中嵌套垂直布局显示
            label3 = QLabel()
            label3.setPixmap(QtGui.QPixmap("image/head2.png"))
            vlayout2 = QVBoxLayout()
            vlayout2.addWidget(QLabel("儿子"))
            vlayout2.addWidget(QLabel("很好呀,妈,你就别担心啦"))
            grid.addWidget(label3, 2, 3, QtCore.Qt.AlignLeft)
            grid.addLayout(vlayout2, 2, 2)
            # 创建对方用户头像、昵称及第2条信息,并在网络中嵌套垂直布局显示
            label4 = QLabel()
            label4.setPixmap(QtGui.QPixmap("image/head1.png"))
            label4.resize(24, 24)
            vlayout3 = QVBoxLayout()
            vlayout3.addWidget(QLabel("老妈"))
            vlayout3.addWidget(QLabel("好吧,你照顾好自己啊"))
            grid.addWidget(label4, 3, 0, QtCore.Qt.AlignRight)
            grid.addLayout(vlayout3, 3, 1)
            # 创建输入框,并设置宽度和高度,跨列添加到网格布局中
            text = QTextEdit()
            text.setFixedWidth(500)
            text.setFixedHeight(80)
            # 在第一行第一列到第一行第四列添加标签控件,并设置居中对齐
            grid.addWidget(text, 4, 0, 1, 4, QtCore.Qt.AlignCenter)
            # 添加“发送”按钮
            grid.addWidget(QPushButton("发送"), 5, 3, QtCore.Qt.AlignRight)
            self.setLayout(grid)     # 设置网格布局
    
    
    if __name__ == "__main__":
        import sys
        app = QApplication(sys.argv)    # 创建窗口程序
        demo = Demo()      # 创建窗口类对象
        demo.show()     # 显示窗口
        sys.exit(app.exec_())
    

    运行结果:
    在这里插入图片描述

    5. MDIArea:MDI窗口设计

    1. 认识MDI窗口

          MDI窗口(Multiple-Document Interface)又称作多文档界面,它主要用于同时显示多个文档,每个文档显示在各自的窗口中。MDI窗口中通常有包含子菜单的窗口菜单,用于在窗口或文档之间进行切换,MDI窗口十分常见。
    典型的MDI窗口示例:
    在这里插入图片描述
          MDI窗口的应用非常广泛,例如,如果某公司的库存系统需要实现自动化,则需要使用窗口来输入客户和货物的数据、发出订单以及跟踪订单。这些窗口必须链接或者从属于一个界面,并且必须能够同时处理多个文件。这样,就需要建立MDI窗口以解决这些需求。

    2. 子窗口基础类

          在PyQt5中使用MDIArea控件来设计MDI窗口,其基类是QMdiArea,而子窗口是一个QMdiSubWindow类的实例,我们可以将任何QWidget设置为子窗口的内部控件,子窗口默认在MDI区域是级联显示的。

    QMdiArea类的常用方法及说明
    方法说明
    addSubWindow()添加子窗口
    removeSubWindow()删除子窗口
    setActiveSubWindow()激活子窗口
    closeActiveSubWindow()关闭正在活动状态的子窗口
    subWindowList()获取MDI区域的子窗口列表
    cascadeSubWindows()级联排列显示子窗口
    tileSubWindows()平铺排列显示子窗口

          QMdiSubWindow类常用的方法为setWidget(),该方法用来向子窗口中添加PyQt5控件。

    3. MDI子窗口的动态添加及排列

          本节使用QMdiArea类和QMdiSubWindow类的相应方法设计一个可以动态添加子窗口,并能够对子窗口进行排列显示的实例。

    示例:子窗口的动态添加及排列

          在Qt Designer设计器中创建一个MainWindow窗口,删除默认的状态栏,然后添加一个MDIArea控件,适当调整大小,设计完成后,保存为.ui文件,并使用PyUIC工具将其转换为.py代码文件。在.py文件中自定义一个action()槽函数,用来根据单击的菜单项,执行相应的新建子窗口、平铺显示子窗口和级联显示子窗口操作;然后将自定义的action()槽函数与菜单的triggered信号相关联。最后为.py文件添加__main__主方法。
    完整代码如下:

    from PyQt5 import QtCore, QtWidgets
    from PyQt5.QtWidgets import *
    
    
    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
            MainWindow.setObjectName("MainWindow")
            MainWindow.resize(481, 274)    # 设置窗口大小
            MainWindow.setWindowTitle("MDI窗口")    # 设置窗口标题
            self.centralwidget = QtWidgets.QWidget(MainWindow)
            self.centralwidget.setObjectName("centralwidget")
            # 创建MDI窗口区域
            self.mdiArea = QtWidgets.QMdiArea(self.centralwidget)
            self.mdiArea.setGeometry(QtCore.QRect(0, 0, 481, 251))
            self.mdiArea.setObjectName("mdiArea")
            MainWindow.setCentralWidget(self.centralwidget)
            # 创建菜单栏
            self.menubar = QtWidgets.QMenuBar(MainWindow)
            self.menubar.setGeometry(QtCore.QRect(0, 0, 481, 23))
            self.menubar.setObjectName("menubar")
            # 设置主菜单
            self.menu = QtWidgets.QMenu(self.menubar)
            self.menu.setObjectName("menu")
            self.menu.setTitle("子窗体操作")
            MainWindow.setMenuBar(self.menubar)
            # 设置新建菜单项
            self.actionxinjian = QtWidgets.QAction(MainWindow)
            self.actionxinjian.setObjectName("actionxinjian")
            self.actionxinjian.setText("新建")
            # 设置平铺菜单项
            self.actionpingpu = QtWidgets.QAction(MainWindow)
            self.actionpingpu.setObjectName("actionpingpu")
            self.actionpingpu.setText("平铺显示")
            # 设置级联菜单项
            self.actionjilian = QtWidgets.QAction(MainWindow)
            self.actionjilian.setObjectName("actionjilian")
            self.actionjilian.setText("级联显示")
            # 将新建的3个菜单项添加到主菜单中
            self.menu.addAction(self.actionxinjian)
            self.menu.addAction(self.actionpingpu)
            self.menu.addAction(self.actionjilian)
            # 将设置完成的主菜单添加到菜单栏中
            self.menubar.addAction(self.menu.menuAction())
            QtCore.QMetaObject.connectSlotsByName(MainWindow)
            # 为菜单项关联信号
            self.menubar.triggered[QAction].connect(self.action)
        count = 0             # 定义变量,用来表示新建的子窗口个数
        # 自定义槽函数,根据选择的菜单执行相应操作
        def action(self, m):
            if m.text() == "新建":
                sub = QMdiSubWindow()      # 创建子窗口对象
                self.count = self.count + 1    # 记录子窗口个数
                # 设置子窗口标题
                sub.setWindowTitle("子窗口" + str(self.count))
                # 在子窗口中添加一个标签,并设置文本
                sub.setWidget(QLabel("这是第 %d 个子窗口" % self.count))
                self.mdiArea.addSubWindow(sub)    # 将新建的子窗口添加到MDI区域
                sub.show()     # 显示子窗口
            elif m.text() == "平铺显示":
                self.mdiArea.tileSubWindows()     # 对子窗口平铺排列
            elif m.text() == "级联显示":
                self.mdiArea.cascadeSubWindows()     # 对子窗口级联排列
    
    
    # 主方法
    if __name__ == "__main__":
        import sys
        app = QApplication(sys.argv)
        MainWindow = QMainWindow()     # 创建窗体对象
        ui = Ui_MainWindow()       # 创建PyQt5设计的窗体对象
        ui.setupUi(MainWindow)    # 调用PyQt5窗体的方法对窗体对象进行初始化设置
        MainWindow.show()      # 显示窗体
        sys.exit(app.exec_())    # 程序关闭时退出进程
    
    

    运行结果:
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    (三)菜单、工具栏和状态栏

          菜单是窗口应用程序的主要用户界面要素,工具栏为应用程序提供了操作系统的界面,状态栏显示系统的一些状态信息,在PyQt5中,菜单、工具栏和状态栏都不以标准控件的形式体现,用QMenu、QToolBar和QStatusBar类表示菜单、工具栏和状态栏。菜单、工具栏和状态栏是一个项目中最常用到的3大部分。那么,如何使用菜单、工具栏和状态栏呢?

    1. 菜单

          在PyQt5中,菜单栏使用QMenuBar类表示,它分为两部分:主菜单菜单项,其中,主菜单被显示为一个QMenu类,而菜单项则使用QAciton类表示。一个QMenu中可以包含任意多个QAction对象,也可以包含另外的QMenu,用来表示级联菜单。

    1. 菜单基础类

          在PyQt5窗口中创建菜单时,需要QMenuBar类、QMenu类和QAction类,创建一个菜单,基本上就是使用这3个类完成下图的3个步骤。
    在这里插入图片描述

    1. QMenuBar类

          QMenuBar类是所有窗口的菜单栏,用户需要在此基础上添加不同的QMenu和QAction,创建菜单栏有两种方法,分别是QMenuBar类的构造方法或者MainWindow对象的menuBar()方法。

    self.menuBar = QtWidgets.QMenuBar(MainWindow)
    

    self.menuBar = MainWindow.menuBar()
    

          创建完菜单栏之后,就可以使用QMenuBar类的相关方法进行菜单的设置。

    QMenuBar类的常用方法及说明
    方法说明
    addAction()添加菜单项
    addActions()添加多个菜单项
    addMenu()添加菜单
    addSeparator()添加分割线
    2. QMenu类

          QMenu类表示菜单栏中的菜单,可以显示文本和图标,但是并不负责执行操作,类似Label的作用。

    QMenu类的常用方法及说明
    方法说明
    addAction()添加菜单项
    addMenu()添加菜单
    addSeparator()添加分割线
    setTitle()设置菜单的文本
    title()获取菜单的标题文本
    3. QAction类

          PyQt5将用户与界面进行交互的元素抽象为一种“动作”,使用QAction类表示。QAction才是真正负责执行操作的部件。

    QAction类的常用方法及说明
    方法说明
    setIcon()设置菜单项图标
    setIconVisibleInMenu()设置图标是否显示
    setText()添加菜单项文本
    setIconText()设置图标文本
    setShortcut()设置快捷键
    setToolTip()设置提示文本
    setEnabled()设置菜单项是否可用
    text()获取菜单项的文本

          QAction类有一个常用的信号triggered,用来在单击菜单项时发射。
          使用PyQt5中的菜单时,只有QAction菜单项可以执行操作,QMenuBar菜单栏和QMenu菜单都是不会执行任何操作的,这点一定要注意,这与其他语言的窗口编程有所不同。

    2. 添加和删除菜单

          在PyQt5中,使用Qt Designer设计器创建一个MainWindow窗口时,窗口中默认有一个菜单栏和一个状态栏。
          由于一个窗口中只能有一个菜单栏,所以在默认的MainWindow窗口中单击右键,是无法添加菜单的。这时首先需要删除原有的菜单,删除菜单非常简单,在菜单上单击右键,选择“Remove Menu Bar”即可。
    MainWindow窗口中的默认菜单栏和状态栏:
    在这里插入图片描述
    MainWindow窗口的默认右键菜单:
    在这里插入图片描述
    删除菜单:

    在这里插入图片描述

    添加菜单:

    在这里插入图片描述

    3. 设置菜单项

          设置菜单项,即为菜单添加相应的菜单项,在默认的菜单上双击,即可将菜单项变成一个输入框。在这里插入图片描述
    输入完成后,按Enter键,即可在添加的菜单右侧和下方自动生成新的提示,根据自己的需求继续重复这个步骤添加菜单和菜单栏。
    在这里插入图片描述

    4. 为菜单设置快捷键

          为菜单设置快捷键有两种方法,一种是在输入菜单文本时设置,一种使用setShortcut()方法设置。

    1. 在输入菜单文本时设置快捷键

          输入菜单文本时设置快捷键,只需要在文本中输入**“&+字母”**的形式即可。
          例如,为“新建”菜单设置快捷键,则直接输入文本“(&N)”,这时就可以使用Alt+N快捷键来调用该菜单。
    在这里插入图片描述
    在这里插入图片描述

    2. 使用setShorcut()方法设置快捷键

          使用setShortcut()方法设置快捷键时,只需要输入相应的快捷组合键即可。

    
    self.actionxinjian.setShortcut("Ctrl+N")
    

    效果如下:
    在这里插入图片描述

    5. 为菜单设置图标

          为菜单设置图标需要使用setIcon()方法,该方法要求有一个QIcon对象作为参数。
          例如,下面的代码是为“新建”菜单设置图标:

    icon = QtGui.QIcon()
    icon.addPixmap(QtGui.QPixmap("./image/nex.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
    self.actionxinjian.setIcon(icon)
    

    在这里插入图片描述

    完整代码
    # -*- coding: utf-8 -*-
    
    # Form implementation generated from reading ui file 'untitled1.ui'
    #
    # Created by: PyQt5 UI code generator 5.15.7
    #
    # WARNING: Any manual changes made to this file will be lost when pyuic5 is
    # run again.  Do not edit this file unless you know what you are doing.
    
    
    from PyQt5 import QtCore, QtGui, QtWidgets
    
    
    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
            MainWindow.setObjectName("MainWindow")
            MainWindow.resize(828, 549)
            self.centralwidget = QtWidgets.QWidget(MainWindow)
            self.centralwidget.setObjectName("centralwidget")
            MainWindow.setCentralWidget(self.centralwidget)
            self.statusbar = QtWidgets.QStatusBar(MainWindow)
            self.statusbar.setObjectName("statusbar")
            MainWindow.setStatusBar(self.statusbar)
            self.menuBar = QtWidgets.QMenuBar(MainWindow)
            self.menuBar.setGeometry(QtCore.QRect(0, 0, 828, 26))
            self.menuBar.setObjectName("menuBar")
            self.menu = QtWidgets.QMenu(self.menuBar)
            self.menu.setObjectName("menu")
            self.menu_2 = QtWidgets.QMenu(self.menuBar)
            self.menu_2.setObjectName("menu_2")
            self.menu_3 = QtWidgets.QMenu(self.menuBar)
            self.menu_3.setObjectName("menu_3")
            MainWindow.setMenuBar(self.menuBar)
            # 新建
            self.action_N = QtWidgets.QAction(MainWindow)
            self.action_N.setObjectName("action_N")
            self.action_N.setShortcut("Ctrl+N")
            icon1 = QtGui.QIcon()
            icon1.addPixmap(QtGui.QPixmap("./image/xinjian.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
            self.action_N.setIcon(icon1)
            # 打开
            self.actionshanchu = QtWidgets.QAction(MainWindow)
            self.actionshanchu.setObjectName("actionshanchu")
            self.actionshanchu.setShortcut("Ctrl+O")
            icon2 = QtGui.QIcon()
            icon2.addPixmap(QtGui.QPixmap("./image/dakai.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
            self.actionshanchu.setIcon(icon2)
            # 关闭
            self.action = QtWidgets.QAction(MainWindow)
            self.action.setObjectName("action")
            self.action.setShortcut("Ctrl+E")
            icon3 = QtGui.QIcon()
            icon3.addPixmap(QtGui.QPixmap("./image/guanbi.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
            self.action.setIcon(icon3)
    
            self.menu.addAction(self.action_N)
            self.menu.addAction(self.actionshanchu)
            self.menu.addAction(self.action)
            self.menuBar.addAction(self.menu.menuAction())
            self.menuBar.addAction(self.menu_2.menuAction())
            self.menuBar.addAction(self.menu_3.menuAction())
    
            self.retranslateUi(MainWindow)
            QtCore.QMetaObject.connectSlotsByName(MainWindow)
    
        def retranslateUi(self, MainWindow):
            _translate = QtCore.QCoreApplication.translate
            MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
            self.menu.setTitle(_translate("MainWindow", "文件"))
            self.menu_2.setTitle(_translate("MainWindow", "选项"))
            self.menu_3.setTitle(_translate("MainWindow", "编辑"))
            self.action_N.setText(_translate("MainWindow", "新建(&N)"))
            self.actionshanchu.setText(_translate("MainWindow", "打开(&O)"))
            self.action.setText(_translate("MainWindow", "关闭(&E)"))
    
    
    import sys
    
    
    if __name__ == "__main__":
        app = QtWidgets.QApplication(sys.argv)
        MainWindow = QtWidgets.QMainWindow()
        ui = Ui_MainWindow()
        ui.setupUi(MainWindow)
        MainWindow.show()
        sys.exit(app.exec_())
    

    6. 菜单的功能实现

          在单击菜单项时,可以触发其triggered信号,通过为该信号关联槽函数,可以实现相应的菜单项功能。

    示例:点击菜单项弹出信息提示框

          在前面设计的菜单栏基础上,为菜单项添加相应的事件,单击菜单项时,弹出信息提示框,提示选择了哪个菜单。
    完整代码如下:

    # -*- coding: utf-8 -*-
    
    from PyQt5 import QtCore, QtGui, QtWidgets
    
    
    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
            MainWindow.setObjectName("MainWindow")
            MainWindow.resize(344, 115)
            self.centralwidget = QtWidgets.QWidget(MainWindow)
            self.centralwidget.setObjectName("centralwidget")
            MainWindow.setCentralWidget(self.centralwidget)
            # self.menuBar = MainWindow.menuBar()
            # 添加菜单栏
            self.menuBar = QtWidgets.QMenuBar(MainWindow)
            self.menuBar.setGeometry(QtCore.QRect(0, 0, 344, 23))
            self.menuBar.setObjectName("menuBar")
            # 添加“文件”菜单
            self.menu = QtWidgets.QMenu(self.menuBar)
            self.menu.setObjectName("menu")
            self.menu.setTitle("文件")
            # 添加“编辑”菜单
            self.menu_2 = QtWidgets.QMenu(self.menuBar)
            self.menu_2.setObjectName("menu_2")
            self.menu_2.setTitle("编辑")
            MainWindow.setMenuBar(self.menuBar)
            # 添加“新建”菜单
            self.actionxinjian = QtWidgets.QAction(MainWindow)
            self.actionxinjian.setEnabled(True)   # 设置菜单可用
            # 为菜单设置图标
            icon = QtGui.QIcon()
            icon.addPixmap(QtGui.QPixmap("./image/xinjian.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
            self.actionxinjian.setIcon(icon)
            # 设置菜单为Windows快捷键
            self.actionxinjian.setShortcut(QtCore.Qt.WindowShortcut)
            self.actionxinjian.setIconVisibleInMenu(True)   # 设置图标可见
            self.actionxinjian.setObjectName("actionxinjian")
            self.actionxinjian.setText("新建(&N)")    # 设置菜单文本
            self.actionxinjian.setIconText("新建")     # 设置图标文本
            self.actionxinjian.setToolTip("新建")    # 设置提示文本
            self.actionxinjian.setShortcut("Ctrl+N")   # 设置快捷键
            # 添加“打开”菜单
            self.actiondakai = QtWidgets.QAction(MainWindow)
            # 为菜单设置图标
            icon1 = QtGui.QIcon()
            icon1.addPixmap(QtGui.QPixmap("./image/dakai.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
            self.actiondakai.setIcon(icon1)
            self.actiondakai.setObjectName("actiondakai")
            self.actiondakai.setText("打开(&O)")       # 设置菜单文本
            self.actiondakai.setIconText("打开")    # 设置图标文本
            self.actiondakai.setToolTip("打开")       # 设置提示文本
            self.actiondakai.setShortcut("Ctrl+O")    # 设置快捷键
            # 添加“关闭”菜单
            self.actionclose = QtWidgets.QAction(MainWindow)
            # 为菜单设置图标
            icon2 = QtGui.QIcon()
            icon2.addPixmap(QtGui.QPixmap("image/guanbi.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
            self.actionclose.setIcon(icon2)
            self.actionclose.setObjectName("actionclose")
            self.actionclose.setText("关闭(&C)")     # 设置菜单文本
            self.actionclose.setIconText("关闭")    # 设置图标文本
            self.actionclose.setToolTip("关闭")    # 设置提示文本
            self.actionclose.setShortcut("Ctrl+C")     # 设置快捷键
            self.menu.addAction(self.actionxinjian)    # 在“文件”菜单中添加“新建”菜单项
            self.menu.addAction(self.actiondakai)     # 在“文件”菜单中添加“打开”菜单项
            self.menu.addSeparator()    # 添加分割线
            self.menu.addAction(self.actionclose)     # 在“文件”菜单中添加“关闭”菜单项
            # 将“文件”菜单的菜单项添加到菜单栏中
            self.menuBar.addAction(self.menu.menuAction())
            # 将“编辑”菜单的菜单项添加到菜单栏中
            self.menuBar.addAction(self.menu_2.menuAction())
            self.retranslateUi(MainWindow)
            QtCore.QMetaObject.connectSlotsByName(MainWindow)
            # 为菜单中的QAction绑定triggered信号
            self.menu.triggered[QtWidgets.QAction].connect(self.getmenu)
    
        def getmenu(self, m):
            from PyQt5.QtWidgets import QMessageBox
            # 使用information()方法弹出信息提示框
            QMessageBox.information(MainWindow, "提示", "您选择的是"+m.text(), QMessageBox.Ok)
    
        def retranslateUi(self, MainWindow):
            _translate = QtCore.QCoreApplication.translate
            MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
    
    
    import sys
    
    
    if __name__ == "__main__":
        app = QtWidgets.QApplication(sys.argv)
        MainWindow = QtWidgets.QMainWindow()
        ui = Ui_MainWindow()
        ui.setupUi(MainWindow)
        MainWindow.show()
        sys.exit(app.exec_())
    
    

    运行结果:

    在这里插入图片描述
    在这里插入图片描述
          以上代码为菜单项绑定triggered信号时,通过QMenu菜单进行了绑定:

    self.menu.triggered[QtWidgets.QAction].connnect(self.getmenu)
    

    实际上,如果每个菜单项实现的功能不同,还可以单独为每个菜单项绑定triggered信号。

    # 单独为“新建”菜单绑定triggered信号
    self.actionxinjian.triggered.connect(self.getmenu)
    def getmenu(self):
    	from PyQt5.QtWidgets import QMessageBox
    	# 使用information()方法弹出信息提示框
    	QMessageBox.information(MainWindow, "提示", "您选择的是"+self.actionxinjian.text(), QMessageBox.Ok)
    

    2. 工具栏

          工具栏主要为窗口应用程序提供一些常用的快捷按钮、操作等。在PyQt5中,用QToolBar类表示工具栏。

    1. 工具栏类:QToolBar

          QToolBar类表示工具栏,它是一个由文本按钮、图标或者其他小控件组成的可移动面板,通常位于菜单栏下方。

    QToolBar类的常用方法及说明
    方法说明
    addAction()添加具有多文本或图标的工具按钮
    addActions()一次添加多个工具按钮
    addWidget添加工具栏中按钮以外的控件
    addSeparator()添加分割线
    setIconSize()设置工具栏中图标的大小
    setMovable()设置工具栏是否可以移动
    setOrientation()
    • 设置工具栏的方向,取值如下:
    • Qt.Horizontal:水平工具栏;
    • Qt.Vertical:垂直工具栏;
    setToolButtonStyle()
    • 设置工具栏按钮的显示样式,主要支持以下5种样式:
    • Qt.ToolButtonIconOnly:只显示图标;
    • Qt.ToolButtonTextOnly:只显示文本;
    • Qt.ToolButtonTextBesideIcon:文本显示在图标的旁边;
    • Qt.ToolButtonTextUnderIcon::文本显示在图标的下面;
    • Qt.ToolButtonFollowStyle:跟随系统样式。

          单击工具栏中的按钮时,会发射actionTriggered信号,通过为该信号关联相应的槽函数,即可实现工具栏的相应功能。

    2. 添加工具栏

          在PyQt5的Qt Designer设计器中创建一个Main Window窗口,一个窗口中可以有多个工具栏,添加工具栏非常简单,单击右键,在弹出的快捷菜单中选择“Add Tool Bar”即可。
    在这里插入图片描述
    对应的添加工具栏的代码:

    self.toolBar = QtWidgets.QToolBar(MainWindow)
    self.toolBar.setObjectName("toolBar")
    MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar)
    

          除了使用QToolBar类的构造函数创建工具栏之外,还可以直接使用MainWindow对象的addToolBar()方法进行添加,例如,上面的代码可以替换如下:

    MainWindow.addToolBar("toolBar")
    

    3. 为工具栏添加图标按钮

          为工具栏添加图标按钮,需要用到addAction()方法,需要在该方法中传入一个QIcon对象,用来指定按钮的图标和文本;另外,工具栏中的按钮默认只显示图标,可以通过setToolButtonStyle()方法设置为既显示图标又显示文本。
          例如,下面代码为在工具栏中添加一个“新建”按钮,并且同时显示图标和文本,图标和文本的组合方式为图标显示在文本上方。

    # 设置工具栏中按钮的显示方式为:文字显示在图标的下方
    self.tooBar.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon)
    self.toolBar.addAction(QtGui.QIcon("image/xinjian.png"))   # 为工具栏添加QAction
    

    效果下图所示:
    在这里插入图片描述
    完整代码:

    # -*- coding: utf-8 -*-
    
    # Form implementation generated from reading ui file 'untitled1.ui'
    #
    # Created by: PyQt5 UI code generator 5.15.7
    #
    # WARNING: Any manual changes made to this file will be lost when pyuic5 is
    # run again.  Do not edit this file unless you know what you are doing.
    
    
    from PyQt5 import QtCore, QtGui, QtWidgets
    
    
    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
            MainWindow.setObjectName("MainWindow")
            MainWindow.resize(828, 549)
            self.centralwidget = QtWidgets.QWidget(MainWindow)
            self.centralwidget.setObjectName("centralwidget")
            MainWindow.setCentralWidget(self.centralwidget)
            self.statusbar = QtWidgets.QStatusBar(MainWindow)
            self.statusbar.setObjectName("statusbar")
            MainWindow.setStatusBar(self.statusbar)
            self.menuBar = QtWidgets.QMenuBar(MainWindow)
            self.menuBar.setGeometry(QtCore.QRect(0, 0, 828, 26))
            self.menuBar.setObjectName("menuBar")
            self.menu = QtWidgets.QMenu(self.menuBar)
            self.menu.setObjectName("menu")
            self.menu_2 = QtWidgets.QMenu(self.menuBar)
            self.menu_2.setObjectName("menu_2")
            self.menu_3 = QtWidgets.QMenu(self.menuBar)
            self.menu_3.setObjectName("menu_3")
            MainWindow.setMenuBar(self.menuBar)
            self.toolBar = QtWidgets.QToolBar(MainWindow)
            self.toolBar.setObjectName("toolBar")
            MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar)
            self.action_N = QtWidgets.QAction(MainWindow)
            self.action_N.setObjectName("action_N")
            self.actionshanchu = QtWidgets.QAction(MainWindow)
            self.actionshanchu.setObjectName("actionshanchu")
            self.action = QtWidgets.QAction(MainWindow)
            self.action.setObjectName("action")
            self.menu.addAction(self.action_N)
            self.menu.addAction(self.actionshanchu)
            self.menu.addAction(self.action)
            self.menuBar.addAction(self.menu.menuAction())
            self.menuBar.addAction(self.menu_2.menuAction())
            self.menuBar.addAction(self.menu_3.menuAction())
    
            self.toolBar.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon)
            self.toolBar.addAction(QtGui.QIcon("image/xinjian.png"), "新建")   # 为工具栏添加QAction
    
            self.retranslateUi(MainWindow)
            QtCore.QMetaObject.connectSlotsByName(MainWindow)
    
        def retranslateUi(self, MainWindow):
            _translate = QtCore.QCoreApplication.translate
            MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
            self.menu.setTitle(_translate("MainWindow", "文件"))
            self.menu_2.setTitle(_translate("MainWindow", "选项"))
            self.menu_3.setTitle(_translate("MainWindow", "编辑"))
            self.toolBar.setWindowTitle(_translate("MainWindow", "toolBar"))
            self.action_N.setText(_translate("MainWindow", "新建(&N)"))
            self.actionshanchu.setText(_translate("MainWindow", "删除"))
            self.action.setText(_translate("MainWindow", "设置"))
    
    
    import sys
    
    
    if __name__ == "__main__":
        app = QtWidgets.QApplication(sys.argv)
        MainWindow = QtWidgets.QMainWindow()
        ui = Ui_MainWindow()
        ui.setupUi(MainWindow)
        MainWindow.show()
        sys.exit(app.exec_())
    

    4. 一次为工具栏添加多个按钮图标

          一次为工具栏添加多个图标按钮需要用到addActions()方法,需要在该方法中传入一个Iterable迭代器对象,对象中的元素必须是QAction对象。
          例如,下面使用addActions()方法同时为工具栏添加“打开”和“关闭”两个图标按钮:

    # 创建“打开”按钮对象
    self.open = QtWidgets.QAction(QtGui.QIcon("image/dakai.png"), "打开")
    # 创建“关闭”按钮对象
    self.close = QtWidgets.QAction(QtGui.QIcon("image/guanbi.png", "关闭"))
    # 将创建的两个QAction添加到工具栏中
    self.toolBar.addActions([self.open, self.close])
    

    效果如下:
    在这里插入图片描述

    5. 向工具栏中添加其他控件

          除了使用QAction对象向工具栏中添加图标按钮之外,PyQt5还支持向工具栏中添加标准控件,如常用的Label、LineEdit、ComboBox、CheckBox等,这需要用到QToolBar对象的addWidget()方法
          例如,下面的代码是向工具栏中添加一个ComboBox下拉列表:

    # 创建一个ComboBox下拉列表控件
    self.combobox=QtWidgets.QComboBox()
    # 定义职位列表
    list = ["总经理", "副总经理", "人事部经理", "财务部经理", "部门经理", "普通员工"]
    self.combobox.addItems(list)    # 将职位列表添加到ComboBox下拉列表中
    self.toolBar.addWidget(self.combobox)   # 将下拉列表添加到工具栏中
    

    运行结果:
    在这里插入图片描述

    6. 设置工具栏按钮的大小

          工具栏中的图标按钮默认大小是24×24,但在使用时,根据实际的需要,对工具栏按钮大小的要求也会有所不同,这时可以使用setIconSize()方法改变工具栏按钮的大小。
          例如,下面代码将工具栏中的图标按钮大小修改为16×16:

    self.toolBar.setIconSize(QtCore.QSize(16, 16))
    

    效果对比:
    在这里插入图片描述
    完整代码如下:

    # -*- coding: utf-8 -*-
    
    # Form implementation generated from reading ui file 'untitled1.ui'
    #
    # Created by: PyQt5 UI code generator 5.15.7
    #
    # WARNING: Any manual changes made to this file will be lost when pyuic5 is
    # run again.  Do not edit this file unless you know what you are doing.
    
    
    from PyQt5 import QtCore, QtGui, QtWidgets
    
    
    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
            MainWindow.setObjectName("MainWindow")
            MainWindow.resize(828, 549)
            self.centralwidget = QtWidgets.QWidget(MainWindow)
            self.centralwidget.setObjectName("centralwidget")
            MainWindow.setCentralWidget(self.centralwidget)
            self.statusbar = QtWidgets.QStatusBar(MainWindow)
            self.statusbar.setObjectName("statusbar")
            MainWindow.setStatusBar(self.statusbar)
            self.menuBar = QtWidgets.QMenuBar(MainWindow)
            self.menuBar.setGeometry(QtCore.QRect(0, 0, 828, 26))
            self.menuBar.setObjectName("menuBar")
            self.menu = QtWidgets.QMenu(self.menuBar)
            self.menu.setObjectName("menu")
            self.menu_2 = QtWidgets.QMenu(self.menuBar)
            self.menu_2.setObjectName("menu_2")
            self.menu_3 = QtWidgets.QMenu(self.menuBar)
            self.menu_3.setObjectName("menu_3")
            MainWindow.setMenuBar(self.menuBar)
            self.toolBar = QtWidgets.QToolBar(MainWindow)
            self.toolBar.setObjectName("toolBar")
            MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar)
            self.action_N = QtWidgets.QAction(MainWindow)
            self.action_N.setObjectName("action_N")
            self.actionshanchu = QtWidgets.QAction(MainWindow)
            self.actionshanchu.setObjectName("actionshanchu")
            self.action = QtWidgets.QAction(MainWindow)
            self.action.setObjectName("action")
            self.menu.addAction(self.action_N)
            self.menu.addAction(self.actionshanchu)
            self.menu.addAction(self.action)
            self.menuBar.addAction(self.menu.menuAction())
            self.menuBar.addAction(self.menu_2.menuAction())
            self.menuBar.addAction(self.menu_3.menuAction())
    
            # 设置工具栏中按钮的显示方式为:文字显示在图标的下方
            self.toolBar.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon)
            self.toolBar.addAction(QtGui.QIcon("image/xinjian.png"), "新建")   # 为工具栏添加QAction
    
            # 创建“打开”按钮对象
            self.open = QtWidgets.QAction(QtGui.QIcon("image/dakai.png"), "打开")
            # 创建“关闭”按钮对象
            self.close = QtWidgets.QAction(QtGui.QIcon("image/guanbi.png"), "关闭")
            # 将创建的两个QAction添加到工具栏中
            self.toolBar.addActions([self.open, self.close])
    
            # 创建一个ComboBox下拉列表控件
            self.combobox = QtWidgets.QComboBox()
            # 定义职位列表
            list = ["总经理", "副总经理", "人事部经理", "部门经理", "普通员工"]
            self.combobox.addItems(list)
            self.toolBar.addWidget(self.combobox)
    
            self.toolBar.setIconSize(QtCore.QSize(16, 16))   # 设置工具栏图标按钮的大小
    
            self.retranslateUi(MainWindow)
            QtCore.QMetaObject.connectSlotsByName(MainWindow)
    
        def retranslateUi(self, MainWindow):
            _translate = QtCore.QCoreApplication.translate
            MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
            self.menu.setTitle(_translate("MainWindow", "文件"))
            self.menu_2.setTitle(_translate("MainWindow", "选项"))
            self.menu_3.setTitle(_translate("MainWindow", "编辑"))
            self.toolBar.setWindowTitle(_translate("MainWindow", "toolBar"))
            self.action_N.setText(_translate("MainWindow", "新建(&N)"))
            self.actionshanchu.setText(_translate("MainWindow", "删除"))
            self.action.setText(_translate("MainWindow", "设置"))
    
    
    import sys
    
    
    if __name__ == "__main__":
        app = QtWidgets.QApplication(sys.argv)
        MainWindow = QtWidgets.QMainWindow()
        ui = Ui_MainWindow()
        ui.setupUi(MainWindow)
        MainWindow.show()
        sys.exit(app.exec_())
    
    
    

    7. 工具栏的单击功能实现

          在单击工具栏中的按钮时,可以触发其actionTriggered信号,通过为该信号关联相应槽函数,可以实现工具栏的相应功能。

    示例:获取单击的工具栏按钮

          在前面设计的工具栏基础上,为工具栏按钮添加相应的事件,提示用户单击了哪个工具栏按钮。完整代码如下:

    from PyQt5 import QtCore, QtGui, QtWidgets
    from PyQt5.QtWidgets import QMessageBox
    
    
    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
            MainWindow.setObjectName("MainWindow")
            MainWindow.resize(309, 137)
            self.centralwidget = QtWidgets.QWidget(MainWindow)
            self.centralwidget.setObjectName("centralwidget")
            MainWindow.setCentralWidget(self.centralwidget)
            self.toolBar = QtWidgets.QToolBar(MainWindow)
            self.toolBar.setObjectName("toolBar")
            self.toolBar.setMovable(True)     # 设置工具栏可移动
            self.toolBar.setOrientation(QtCore.Qt.Horizontal)      # 设置工具栏为水平工具栏
            # 设置工具栏中按钮的显示方式为:文字显示在图标的下方
            self.toolBar.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon)
            # 为工具栏添加QAction
            self.toolBar.addAction(QtGui.QIcon("image/xinjian.png"), "新建")
            # 创建“打开”按钮对象
            self.open = QtWidgets.QAction(QtGui.QIcon("image/dakai.png"), "打开")
            # 创建“关闭”按钮对象
            self.close = QtWidgets.QAction(QtGui.QIcon("image/guanbi.png"), "关闭")
            # 将创建的两个QAction添加到工具栏中
            self.toolBar.addActions([self.open, self.close])
            # 设置工具栏图标按钮的大小
            self.toolBar.setIconSize(QtCore.QSize(16, 16))
            # 创建一个ComboBox下拉列表控件
            self.combobox = QtWidgets.QComboBox()
            # 定义职位列表
            list = ["总经理", "副总经理", "人事部经理", "财务部经理", "部门经理", "普通员工"]
            # 将职位列表添加到ComboBox下拉列表中
            self.combobox.addItems(list)
            # 将下拉列表添加到工具栏中
            self.toolBar.addWidget(self.combobox)
            MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar)
            # 将ComboBox控件的选项更改信号与自定义槽函数关联
            self.combobox.currentIndexChanged.connect(self.showinfo)
            # 为菜单中的QAction绑定triggered信号
            self.toolBar.actionTriggered[QtWidgets.QAction].connect(self.getvalue)
    
        def getvalue(self, m):
            # 使用information()方法弹出信息提示框
            QMessageBox.information(MainWindow, "提示", "您单击了 " + m.text(), QMessageBox.Ok)
    
        def showinfo(self):
            # 显示选择的职位
            QMessageBox.information(MainWindow, "提示", "您选择的职位是:" + self.combobox.currentText(), QMessageBox.Ok)
            self.retranslateUi(MainWindow)
            QtCore.QMetaObject.connectSlotsByName(MainWindow)
    
        def retranslateUi(self, MainWindow):
            _translate = QtCore.QCoreApplication.translate
            MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
            self.toolBar.setWindowTitle(_translate("MainWindow", "toolBar"))
    
    
    import sys
    
    
    if __name__ == "__main__":
        app = QtWidgets.QApplication(sys.argv)
        MainWindow = QtWidgets.QMainWindow()
        ui = Ui_MainWindow()
        ui.setupUi(MainWindow)
        MainWindow.show()
        sys.exit(app.exec_())
    

          运行程序,单击工具栏中的某个图标按钮,提示您单击了哪个按钮:
    在这里插入图片描述
          当用户选择工具栏中下拉列表中的项时,提示选择了哪一项:
    在这里插入图片描述
          单击工具栏中的QAction对象默认会发射actionTriggered信号,但是,如果为工具栏添加了其他控件,并不会发射actionTriggered信号,而是会发射它们自己特有的信号。例如,在上面工具栏中添加的ComboBox下拉列表,在选择下拉列表中的项时,会发射其本身的currentIndexChanged信号。

    3. 状态栏

          状态栏通常放在窗口的最底部,用于显示窗口上的一些对象的相关信息或者程序信息,例如,显示当前登录用户、实时显示登录时间、显示任务执行进度等,在PyQt5中用QStatusBar类表示状态栏。

    1. 状态栏类:QStatusBar

          QStatusBar类表示状态栏,它是一个放置在窗口底部的水平条。

    QStatusBar类的常用方法及说明
    方法说明
    addWidget()向状态栏中添加控件
    addPermanentWidget()添加永久性控件,不会被临时消息掩盖,位于状态栏最右端
    removeWidget()移除状态栏中的控件
    showMessage()在状态栏中显示一条临时信息
    clearMessage()删除正在显示的临时信息

          QStatusBar类有一个常用的信号triggered,用来在单击菜单项时发射。

    2. 添加状态栏

          在PyQt5中,使用Qt Designer设计器创建一个MainWindow窗口时,窗口中默认有一个菜单栏和一个状态栏,由于一个窗口中只能有一个状态栏,所以首先需要删除原有的状态栏,删除状态栏非常简单,在窗口中单击右键,选择“Remove Status Bar”即可。
    在这里插入图片描述
          添加状态栏也非常简单,在一个空窗口上单击右键,在弹出的快捷菜单中选择“创建状态栏”即可:
    在这里插入图片描述
    对应的Python代码:

    self.statusbar = QtWidgets.QStatusBar(MainWindow)
    self.statusbar.setObjectName("statusbar")
    MainWindow.setStatusBar(self.statusbar)
    

    3. 向状态栏中添加控件

          PyQt5支持向状态栏中添加标准控件,如常用的Label、ComboBox、CheckBox、ProgressBar等,这需要用到QStatusBar对象addWidget()方法
          例如,向状态栏中添加一个Label控件,用来显示版权信息:

    self.label=QtWidgets.QLabel()   # 创建一个Label控件
    self.label.setText("版权所有:某某科技有限公司")   # 设置Label的文本
    self.statusbar.addWidget(self.label)    # 将label控件添加到状态栏中
    

    在这里插入图片描述

    4. 在状态栏中显示和删除临时信息

          在状态栏中显示临时信息,需要使用QStatusBar对象的showMessage()方法,该方法中有两个参数,第一个参数为要显示的临时信息内容,第二个参数为要显示的时间,以毫秒为单位,但如果设置该参数为0,则表示一直显示
          例如,下面的代码为在状态栏中显示当前登录用户的信息:

    self.statusbar.showMessage("当前登录用户:mr", 0)    # 在状态栏中显示临时信息
    

    运行效果:
    在这里插入图片描述
          注意,默认情况下,状态栏中的临时信息和添加的控件不能同时显示,否则会发生覆盖重合的情况。例如,将上面讲解的在状态栏中添加Label控件和显示临时信息的代码全部保留,即代码如下:

    self.label = QtWidgets.QLabel()   # 创建一个Label控件
    self.label.setText("版权所有:某某科技有限公司")    # 设置Label的文本
    self.statusbar.addWidget(self.label)    # 将Label控件添加到状态栏中
    self.statusbar.showMessage("当前登录用户:mr", 0)   # 在状态栏中显示临时信息
    

          运行时,会出现如下的效果:
    在这里插入图片描述
          Label控件的文本和临时信息产生了重合。要解决该问题,可以用addPermanentWidget()方法向状态栏中添加控件。

    self.statusbar.addPermanentWidget(self.label)    # 将Label控件添加到状态栏中
    

    效果如下:
    在这里插入图片描述
           删除临时信息使用QStatusBar对象的clearMessage()方法

    self.statusbar.clearMessage()     # 清除状态栏的临时信息
    

    在这里插入图片描述
    完整代码如下:

    from PyQt5 import QtCore, QtGui, QtWidgets
    from PyQt5.QtWidgets import QMessageBox
    
    
    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
            MainWindow.setObjectName("MainWindow")
            MainWindow.resize(309, 137)
            self.centralwidget = QtWidgets.QWidget(MainWindow)
            self.centralwidget.setObjectName("centralwidget")
            MainWindow.setCentralWidget(self.centralwidget)
            self.toolBar = QtWidgets.QToolBar(MainWindow)
            self.toolBar.setObjectName("toolBar")
            self.toolBar.setMovable(True)     # 设置工具栏可移动
            self.toolBar.setOrientation(QtCore.Qt.Horizontal)      # 设置工具栏为水平工具栏
            # 设置工具栏中按钮的显示方式为:文字显示在图标的下方
            self.toolBar.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon)
            # 为工具栏添加QAction
            self.toolBar.addAction(QtGui.QIcon("image/xinjian.png"), "新建")
            # 创建“打开”按钮对象
            self.open = QtWidgets.QAction(QtGui.QIcon("image/dakai.png"), "打开")
            # 创建“关闭”按钮对象
            self.close = QtWidgets.QAction(QtGui.QIcon("image/guanbi.png"), "关闭")
            # 将创建的两个QAction添加到工具栏中
            self.toolBar.addActions([self.open, self.close])
            # 设置工具栏图标按钮的大小
            self.toolBar.setIconSize(QtCore.QSize(16, 16))
            # 创建一个ComboBox下拉列表控件
            self.combobox = QtWidgets.QComboBox()
            # 定义职位列表
            list = ["总经理", "副总经理", "人事部经理", "财务部经理", "部门经理", "普通员工"]
            # 将职位列表添加到ComboBox下拉列表中
            self.combobox.addItems(list)
            # 将下拉列表添加到工具栏中
            self.toolBar.addWidget(self.combobox)
            MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar)
            # 将ComboBox控件的选项更改信号与自定义槽函数关联
            self.combobox.currentIndexChanged.connect(self.showinfo)
            # 为菜单中的QAction绑定triggered信号
            self.toolBar.actionTriggered[QtWidgets.QAction].connect(self.getvalue)
    
            # 窗口底部的设置状态栏
            self.statusbar = QtWidgets.QStatusBar(MainWindow)
            self.statusbar.setObjectName("statusbar")
            MainWindow.setStatusBar(self.statusbar)
    
            self.label = QtWidgets.QLabel()    # 创建一个Label控件
            self.label.setText("版权所有:某某科技有限公司")     # 设置Label的文本
            # self.statusbar.addWidget(self.label)    # 将Label控件添加到状态栏中
            self.statusbar.addPermanentWidget(self.label)    # 将Label控件添加到状态栏中
            # 解决Label文本和临时信息重合的问题:
            self.statusbar.showMessage("当前登录用户:mr", 0)   # 在状态栏中显示临时信息
            # 删除状态栏中的临时信息:
            self.statusbar.clearMessage()
    
        def getvalue(self, m):
            # 使用information()方法弹出信息提示框
            QMessageBox.information(MainWindow, "提示", "您单击了 " + m.text(), QMessageBox.Ok)
    
        def showinfo(self):
            # 显示选择的职位
            QMessageBox.information(MainWindow, "提示", "您选择的职位是:" + self.combobox.currentText(), QMessageBox.Ok)
            self.retranslateUi(MainWindow)
            QtCore.QMetaObject.connectSlotsByName(MainWindow)
    
        def retranslateUi(self, MainWindow):
            _translate = QtCore.QCoreApplication.translate
            MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
            self.toolBar.setWindowTitle(_translate("MainWindow", "toolBar"))
    
    
    import sys
    
    
    if __name__ == "__main__":
        app = QtWidgets.QApplication(sys.argv)
        MainWindow = QtWidgets.QMainWindow()
        ui = Ui_MainWindow()
        ui.setupUi(MainWindow)
        MainWindow.show()
        sys.exit(app.exec_())
    

    5. 在状态栏中实时显示当前时间

    示例:在状态栏中实时显示当前时间

          在PyQt5的Qt Designer设计器中创建一个MainWindow窗口,删除默认的菜单栏,保留状态栏,然后调整窗口的大小,并保存为.ui文件,将.ui文件转换为.py文件,在.py文件中使用QTimer计时器实时获取当前的日期时间,并使用QStatusBar对象的showMessage()方法显示在状态栏上。
    完整代码如下:

    # -*- coding: utf-8 -*-
    
    from PyQt5 import QtCore, QtGui, QtWidgets
    
    
    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
            MainWindow.setObjectName("MainWindow")
            MainWindow.resize(433, 381)
            self.centralwidget = QtWidgets.QWidget(MainWindow)
            self.centralwidget.setObjectName("centralwidget")
            MainWindow.setCentralWidget(self.centralwidget)
            # 添加一个状态栏
            self.statusbar = QtWidgets.QStatusBar(MainWindow)
            self.statusbar.setObjectName("statusbar")
            MainWindow.setStatusBar(self.statusbar)
            # 创建一个QTimer计时器对象
            timer = QtCore.QTimer(MainWindow)
            # 发射timeout信号,与自定义槽函数关联
            timer.timeout.connect(self.showtime)
            # 启动计时器
            timer.start()
    
            self.retranslateUi(MainWindow)
            QtCore.QMetaObject.connectSlotsByName(MainWindow)
    
        def retranslateUi(self, MainWindow):
            _translate = QtCore.QCoreApplication.translate
            MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
    
        # 自定义槽函数,用来在状态栏中显示当前日期时间
        def showtime(self):
            # 获取当前日期时间
            datetime = QtCore.QDateTime.currentDateTime()
            # 对日期时间进行格式化
            text = datetime.toString("yyyy-MM-dd HH:mm:ss")
            # 在状态栏中显示日期时间
            self.statusbar.showMessage("当前日期时间:" + text, 0)
    
    
    
    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_())     # 程序关闭时退出进程
    

    运行程序,在窗口中的状态栏中会实时显示系统当前的日期时间:
    在这里插入图片描述

    QTimer类的简单说明

          上面代码中用到了PyQt5中的QTimer类,该类是一个计时器类,它最常用的两个方法时start()和stop()方法,其中,start()方法用来启动计时器,参数以秒为单位,默认为1秒;stop()方法用来停止计时器。另外,QTimer类还提供了一个timeout信号,在执行定时操作时发射该信号。

    Logo

    为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

    更多推荐