四、PyQt对话框的使用

(五)对话框的使用

      平时在使用各种软件或者网站时,经常会看到各种各样的对话框,有的对话框可以与用户进行交互,而有的只是显示一些提示信息。使用PyQt5设计的窗口程序,同样支持弹出对话框,在PyQt5中,常用的对话框有QMessageBox内置对话框QFileDialog对话框QInputDialog对话框QFontDialog对话框QColorDialog对话框。重点需要掌握的是QMessageBox对话框、QFileDialog文件对话框、QInputDialog输入对话框。

1. QMessageBox:对话框

      我们平时使用软件时可以看到各种各样的对话框,例如,电脑管家的退出对话框如下:
在这里插入图片描述

1. 对话框的种类

      在PyQt5中,对话框使用QMessageBox类表示,PyQt5内置5种不同类型的对话框,分别是消息对话框问答对话框警告对话框错误对话框关于对话框,他们主要的区别是弹出的对话框中的图标不同

PyQt5内置的5种不同类型对话框
对话框类型说明
QMessageBox.information()消息对话框
QMessageBox.question()问答对话框
QMessageBox.warning()警告对话框
QMessageBox.critical()错误对话框
QMessageBox.about()关于对话框

2. 对话框的使用方法

      PyQt5内置的5种不同类型对话框在使用时是类似的,以消息对话框为例。消息对话框使用QMessageBox.information()表示,语法如下:

QMessageBox.information(QWidget, "Title", "Content", buttons, defaultbutton)
QMessageBox.information()方法的参数说明
参数说明
QWidgetself或者窗口对象,表示该对话框所属的窗口。
Title字符串,表示对话框的标题。
Content字符串,表示对话框种的提示内容。
buttons对话框上要添加的按钮,多个按钮之间用”
defaultbutton默认选中的按钮,该值可选,没有指定该值时,默认为第一个按钮。
对话框种的按钮种类
按钮种类说明
QMessageBox.Ok同意操作
QMessageBox.Yes同意操作
QMessageBox.No取消操作
QMessageBox.Abort终止操作
QMessageBox.Retry重试操作
QMessageBox.Ignore忽略操作
QMessageBox.Close关闭操作
QMessageBox.Cancel取消操作
QMessageBox.Open打开操作
QMessageBox.Save保存操作

      关于对话框QMessageBox.about()中不能指定按钮。语法如下:

QMessageBox.about(QWidget, "Title", "Content")
示例:弹出5种不同的对话框

      打开Qt Designer设计器,新建一个窗口,在窗口中添加5个PushButton控件,并分别设置它们的文本为“消息框”、“警告框”、“问答框”、“错误框”、“关于框”,设计完成后保存为.ui文件,使用PyUIC工具将其转换为.py文件。在.py文件中,定义5个槽函数,分别使用QMessageBox类的不同方法弹出对话框。
关键代码如下:

        # 为按钮控件的clicked信号绑定自定义槽函数
        # 关联“消息框”按钮的方法
        self.pushButton.clicked.connect(self.info)
        # 关联“警告框”按钮的方法
        self.pushButton_2.clicked.connect(self.warn)
        # 关联“问答框”按钮的方法
        self.pushButton_3.clicked.connect(self.question)
        # 关联“错误框”按钮的方法
        self.pushButton_4.clicked.connect(self.critical)
        # 关联“关于框”按钮的方法
        self.pushButton_5.clicked.connect(self.about)

    # 自定义槽函数
    def info(self):    # 显示消息对话框
        QMessageBox.information(None, "消息", "这是一个消息对话框", QMessageBox.Ok)

    def warn(self):    # 显示警告对话框
        QMessageBox.warning(None, "警告", "这是一个警告对话框", QMessageBox.Ok)

    def question(self):   # 显示问答对话框
        QMessageBox.question(None, "问答", "这是一个问答对话框", QMessageBox.Ok)

    def critical(self):    # 显示错误对话框
        QMessageBox.critical(None, "错误", "这是一个错误对话框", QMessageBox.Ok)

    def about(self):   # 显示关于对话框
        QMessageBox.about(None, "关于", "这是一个关于对话框")

完整代码如下:

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

# Form implementation generated from reading ui file 'untitled.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(475, 95)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(20, 30, 71, 28))
        self.pushButton.setObjectName("pushButton")
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(110, 30, 71, 28))
        self.pushButton_2.setObjectName("pushButton_2")
        self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_3.setGeometry(QtCore.QRect(200, 30, 71, 28))
        self.pushButton_3.setObjectName("pushButton_3")
        self.pushButton_4 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_4.setGeometry(QtCore.QRect(290, 30, 71, 28))
        self.pushButton_4.setObjectName("pushButton_4")
        self.pushButton_5 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_5.setGeometry(QtCore.QRect(380, 30, 71, 28))
        self.pushButton_5.setObjectName("pushButton_5")
        MainWindow.setCentralWidget(self.centralwidget)

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

        # 为按钮控件的clicked信号绑定自定义槽函数
        # 关联“消息框”按钮的方法
        self.pushButton.clicked.connect(self.info)
        # 关联“警告框”按钮的方法
        self.pushButton_2.clicked.connect(self.warn)
        # 关联“问答框”按钮的方法
        self.pushButton_3.clicked.connect(self.question)
        # 关联“错误框”按钮的方法
        self.pushButton_4.clicked.connect(self.critical)
        # 关联“关于框”按钮的方法
        self.pushButton_5.clicked.connect(self.about)


    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "消息框"))
        self.pushButton_2.setText(_translate("MainWindow", "警告框"))
        self.pushButton_3.setText(_translate("MainWindow", "问答框"))
        self.pushButton_4.setText(_translate("MainWindow", "错误框"))
        self.pushButton_5.setText(_translate("MainWindow", "关于框"))

    # 自定义槽函数
    def info(self):    # 显示消息对话框
        QMessageBox.information(None, "消息", "这是一个消息对话框", QMessageBox.Ok)

    def warn(self):    # 显示警告对话框
        QMessageBox.warning(None, "警告", "这是一个警告对话框", QMessageBox.Ok)

    def question(self):   # 显示问答对话框
        QMessageBox.question(None, "问答", "这是一个问答对话框", QMessageBox.Ok)

    def critical(self):    # 显示错误对话框
        QMessageBox.critical(None, "错误", "这是一个错误对话框", QMessageBox.Ok)

    def about(self):   # 显示关于对话框
        QMessageBox.about(None, "关于", "这是一个关于对话框")


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. 与对话框进行交互

      实际开发时,可能会需要根据对话框的返回值执行相应的操作,PyQt5中的QMessageBox对话框支持获取返回值。例如,修改上一示例中的消息对话框的槽函数,使其弹出一个带有“Yes”和“No”按钮的对话框,然后判断当用户单击“Yes”按钮时,弹出“您同意了本次请求……”的信息提示。

示例:修改消息框的槽函数,做简单的交互

修改的关键代码如下:

    def info(self):    # 显示消息对话框
        # 获取对话框的返回值
        select = QMessageBox.information(None, "消息", "这是一个消息对话框", QMessageBox.Yes | QMessageBox.No)
        if select == QMessageBox.Yes:     # 判断是否点击了“Yes”按钮
            QMessageBox.information(MainWindow, "提醒", "您同意了本次请求......")

完整代码如下:

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

# Form implementation generated from reading ui file 'untitled.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(475, 95)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(20, 30, 71, 28))
        self.pushButton.setObjectName("pushButton")
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(110, 30, 71, 28))
        self.pushButton_2.setObjectName("pushButton_2")
        self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_3.setGeometry(QtCore.QRect(200, 30, 71, 28))
        self.pushButton_3.setObjectName("pushButton_3")
        self.pushButton_4 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_4.setGeometry(QtCore.QRect(290, 30, 71, 28))
        self.pushButton_4.setObjectName("pushButton_4")
        self.pushButton_5 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_5.setGeometry(QtCore.QRect(380, 30, 71, 28))
        self.pushButton_5.setObjectName("pushButton_5")
        MainWindow.setCentralWidget(self.centralwidget)

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

        # 为按钮控件的clicked信号绑定自定义槽函数
        # 关联“消息框”按钮的方法
        self.pushButton.clicked.connect(self.info)
        # 关联“警告框”按钮的方法
        self.pushButton_2.clicked.connect(self.warn)
        # 关联“问答框”按钮的方法
        self.pushButton_3.clicked.connect(self.question)
        # 关联“错误框”按钮的方法
        self.pushButton_4.clicked.connect(self.critical)
        # 关联“关于框”按钮的方法
        self.pushButton_5.clicked.connect(self.about)


    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "消息框"))
        self.pushButton_2.setText(_translate("MainWindow", "警告框"))
        self.pushButton_3.setText(_translate("MainWindow", "问答框"))
        self.pushButton_4.setText(_translate("MainWindow", "错误框"))
        self.pushButton_5.setText(_translate("MainWindow", "关于框"))

    # 自定义槽函数
    def info(self):    # 显示消息对话框
        # 获取对话框的返回值
        select = QMessageBox.information(None, "消息", "这是一个消息对话框", QMessageBox.Yes | QMessageBox.No)
        if select == QMessageBox.Yes:     # 判断是否点击了“Yes”按钮
            QMessageBox.information(MainWindow, "提醒", "您同意了本次请求......")

    def warn(self):    # 显示警告对话框
        QMessageBox.warning(None, "警告", "这是一个警告对话框", QMessageBox.Ok)

    def question(self):   # 显示问答对话框
        QMessageBox.question(None, "问答", "这是一个问答对话框", QMessageBox.Ok)

    def critical(self):    # 显示错误对话框
        QMessageBox.critical(None, "错误", "这是一个错误对话框", QMessageBox.Ok)

    def about(self):   # 显示关于对话框
        QMessageBox.about(None, "关于", "这是一个关于对话框")


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_())

      运行效果如下:
在这里插入图片描述
点击“消息框”:
在这里插入图片描述
再点击“Yes”:

在这里插入图片描述

2. QFileDialog:文件对话框

1. QFileDialog类概述

      PyQt5中的文件对话框使用QFileDialog类表示,该类继承自QDialog类,它允许用户选择文件或者文件夹,也允许用户遍历文件系统,以便选择一个或多个文件或文件夹。

QFileDialog类的常用方法及说明
方法说明
getOpenFileName()获取一个打开文件的文件名。
getOpenFileNames()获取多个打开文件的文件名。
getSaveFileName()获取保存的文件名。
getExistingDirectory()获取一个打开的文件夹。
setAcceptMode()
  • 设置接收模式,取值如下:
  • QFileDialog.AcceptOpen:设置文件对话框为打开模式,这是默认值;
  • QFileDialog.AcceptSave:设置文件对话框为保存模式。
setDefaultSuffix()设置文件对话框中的文件名的默认后缀名。
setFileMode()
  • 设置可以选择的文件类型,取值如下:
  • QFileDialog.AnyFile:任意文件(无论文件是否存在);
  • QFileDialog.ExistingFile:已存在的文件;
  • QFileDialog.ExistingFiles:已存在的多个文件。
  • QFileDialog.Directory:文件夹;
  • QFileDialog.DirectoryOnly:文件夹(选择时只能选中文件夹)。
setDirectory()设置文件对话框的默认打开位置。
setNameFilter()设置名称过滤器,多个类型的过滤器之间用两个分号分割(例如:所有文件(*.*);;Python文件(*.py));而一个过滤器中如果有多种格式,可以用空格分割(例如:图片文件(*jpg *.png *.bmp))
setViewMode()
  • 设置显示模式,取值如下:
  • QFileDialog.Detail:显示文件详细信息,包括文件名、大小、日期等信息;
  • QFileDialog.List:以列表形式显示文件名。
selectedFile()获取选择的一个文件或文件夹名字。
selectedFiles()获取选择的多个文件夹或文件夹名字。

2. 使用QFileDialog选择文件

      使用QFileDialog类在PyQt5窗口中选择文件。

示例:选择并显示图片文件

      打开Qt Designer设计器,新建一个窗口,在窗口中添加一个PushButton控件和一个ListWidget控件,其中,PushButton控件用来执行操作,而ListWidget控件用来显示选择的图片文件,设计完成后保存为.ui文件,使用PyUIC工具将其转换为.py代码文件。
      在.py代码文件中,定义一个bindList()槽函数,用来使用QFileDialog类创建一个文件对话框,在该文件对话框中设置可以选择多个文件,并且只能显示图片文件,选择完之后,会将选择的文件显示到ListWidget列表中;最后将自定义的bindList()槽函数绑定到PushButton控件的clicked信号上。
完整代码如下:

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(370, 323)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        # 创建一个按钮控件
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(20, 20, 91, 23))
        self.pushButton.setObjectName("pushButton")
        # 创建一个ListWidget列表,用来显示选择的图片文件
        self.listWidget = QtWidgets.QListWidget(self.centralwidget)
        self.listWidget.setGeometry(QtCore.QRect(20, 50, 331, 261))
        self.listWidget.setObjectName("listWidget")
        MainWindow.setCentralWidget(self.centralwidget)
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
        # 为按钮的clicked信号绑定槽函数
        self.pushButton.clicked.connect(self.bindList)     # 为按钮的clicked信号绑定槽函数

    # 方法一:
    def bindList(self):
        from PyQt5.QtWidgets import QFileDialog
        dir = QFileDialog()     # 创建文件对话框
        dir.setFileMode(QFileDialog.ExistingFiles)     # 设置多选
        dir.setDirectory("D:\\")     # 设置初始路径为D盘
        # 设置只显示图片文件
        dir.setNameFilter("图片文件(*.jpg *.png *.bmp *.ico *.gif)")
        if dir.exec_():      # 判断是否选择了文件
            self.listWidget.addItems(dir.selectedFiles())     # 将选择的文件显示在列表中

    # 方法二:(效果与方法一相同)
    # def bindList(self):
    #     from PyQt5.QtWidgets import QFileDialog
    #     files, filetype = QFileDialog.getOpenFileNames(None, "打开", "D:\\", "图片文件(*.jpg *.png *.ico *.bmp *.gif)")
    #     self.listWidget.addItems(files)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.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_())

      运行程序,单击主窗口中的“选择文件”按钮,弹出“打开”对话框,该对话框中只显示图片文件:
在这里插入图片描述
在这里插入图片描述

      按Ctrl键,可以选择多个文件,选择完文件后,单击“打开”按钮,即可将选择的图片文件显示在ListWidget列表中:
在这里插入图片描述
      Python使用QFileDialog显示打开对话框时,还可以使用getOpenFileName()方法或者getOpenFileNames()方法,其中,getOpenFileName()方法用来获取一个打开文件的文件名,而getOpenFileNames()方法可以获取多个打开文件的文件名。
      上面示例中的bindList()槽函数中打开文件的代码可以替换如下:

    def bindList(self):
        from PyQt5.QtWidgets import QFileDialog
        files, filetype = QFileDialog.getOpenFileNames(None, "打开", "D:\\", "图片文件(*.jpg *.png *.ico *.bmp *.gif)")
        self.listWidget.addItems(files)

3. 使用QFileDialog选择文件夹

      使用QFileDialog选择文件夹时,需要用到getExistingDirectory()方法,该方法需要指定打开对话框的标题和要打开的默认路径

示例:以列表显示指定文件夹中的所有文件

      修改上一示例,在设计的窗口中添加一个LineEdit控件,用来显示选择的路径,并且将PushButton控件的文本修改成“选择”,然后对bindList()自定义槽函数进行修改,在该函数中,主要使用QFileDialog.getExistingDirectory()方法打开一个选择文件夹的对话框,在该对话框中选择一个路径后,首先将选择的路径显示到LineEdit文本框中;然后使用os模块的listdir()方法获取该文件夹中的所有文件和子文件夹,并将它们显示到ListWidget列表中。
关键代码如下:

    # 自定义槽函数
    def bindLine(self):
        from PyQt5.QtWidgets import QFileDialog
        import os    # 导入os模块
        # 创建选择路径对话框
        dir = QFileDialog.getExistingDirectory(None, "选择文件夹路径", os.getcwd())
        self.lineEdit.setText(dir)     # 在文本框中显示选择的路径
        list = os.listdir(dir)        # 遍历选择的文件夹
        self.listWidget.addItems(list)    # 将文件夹中的所有文件显示在列表中
	

完整代码如下:

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(495, 337)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.listWidget = QtWidgets.QListWidget(self.centralwidget)
        self.listWidget.setGeometry(QtCore.QRect(10, 60, 471, 261))
        self.listWidget.setObjectName("listWidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(20, 23, 72, 15))
        self.label.setObjectName("label")
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setGeometry(QtCore.QRect(100, 18, 311, 25))
        self.lineEdit.setObjectName("lineEdit")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(420, 15, 51, 28))
        self.pushButton.setObjectName("pushButton")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
        # 为pushButton的clicked信号绑定自定义槽函数
        self.pushButton.clicked.connect(self.bindLine)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label.setText(_translate("MainWindow", "选择路径:"))
        self.pushButton.setText(_translate("MainWindow", "选择"))

    # 自定义槽函数
    def bindLine(self):
        from PyQt5.QtWidgets import QFileDialog
        import os    # 导入os模块
        # 创建选择路径对话框
        dir = QFileDialog.getExistingDirectory(None, "选择文件夹路径", os.getcwd())
        self.lineEdit.setText(dir)     # 在文本框中显示选择的路径
        list = os.listdir(dir)        # 遍历选择的文件夹
        self.listWidget.addItems(list)    # 将文件夹中的所有文件显示在列表中


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. QInputDialog:输入对话框

1. QInputDialog概述

      QInputDialog类表示一个标准的输入对话框由一个文本框(或者数字选择框,或者下拉列表框)和两个按钮(OK按钮和Cancel按钮)组成,它可以与用户进行简单的交互,例如,在主窗口中获取输入对话框中输入或者选择的值。
QInputDialog类的常用方法及语法如下:

1. getText()方法
  • 显示一个用于输入字符串的文本编辑框。
text, flag = QInputDialog.getText(QWidget, dlgTitle, txtLabel, echoMode, defaultInput)
getText()方法的参数及返回值说明
参数说明
QWidget父窗口对象
dglTitleQInputDialog的标题
txtLabelQInputDialog内部显示的文本
echoMode文本编辑框内容的显示方式
defaultInput文本编辑框默认显示内容
返回值一个元组,其中text表示文本编辑框内的字符串,flag表示是否正常返回
2. getItem()方法
  • 显示一个ComboBox下拉列表控件,用户可以从中选择数据。
text, flag = QInputDialog.getItem(QWidget, dlgTitle, txtLabel, items, curIndex, editable)
getItem()方法的参数及返回值说明
参数说明
QWidget父窗口对象
dglTitleQInputDialog的标题
txtLabelQInputDialog内部显示的文本
itemsComboBox组件的内容列表
curIndex默认显示ComboBox组件哪一个索引的内容
editableComboBox组件是否可被编辑
返回值一个元组,其中text表示从ComboBox下拉列表中选择的内容,flag表示是否正常返回
3. getInt()方法
  • 显示一个用于输入整数的编辑框,显示的是SpinBox控件。
inputValue,flag = QInputDialog.getInt(QWidget, dlgTitle, txtLabel, defaultValue, minValue, maxValue, stepValue)
getInt()方法的参数及返回值
参数说明
QWidget父窗口对象
dglTitleQInputDialog的标题
txtLabelQInputDialog内部显示的文本
defaultValueSpinBox控件默认值
minValueSpinBox控件最小值
maxValueSpinBox控件最大值
stepValueSpinBox控件单步值
返回值一个元组,其中inputValue表示SpinBox中选择的整数值,flag表示是否正常返回
4. getDouble()方法
  • 显示一个用于输入浮点数的编辑框,显示的是DoubleSpinBox控件。
inputValue, flag = QInputDialog.getDouble(QWidget, dlgTitle, txtLabel, defaultValue, minValue, maxValue, decimals)
getDouble()方法的参数及返回值
参数说明
QWidget父窗口对象
dglTitleQInputDialog的标题
txtLabelQInputDialog内部显示的文本
defaultValueDoubleSpinBox控件默认值
minValueDoubleSpinBox控件最小值
maxValueDoubleSpinBox控件最大值
decimalsDoubleSpinBox控件显示的小数点位数控制
返回值一个元组,其中inputValue表示DoubleSpinBox中选择的小数值,flag表示是否正常返回

2. QInputDialog对话框的使用

示例:设计不同种类的输入框

      使用Qt Designer设计器创建一个MainWindow窗口,其中添加4个LineEdit控件,分别用来录入学生的姓名、年龄、班级和分数信息,将设计的窗口保存为.ui文件,使用PyUIC工具将.ui文件转换为.py文件。在.py文件中,分别使用QInputDialog类的4种方法弹出不同的输入框,在输入框中完成学生信息的录入。
完整代码如下:

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


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(210, 164)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        # 添加 “姓名” 标签
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(30, 20, 41, 16))
        self.label.setObjectName("label")
        # 添加输入姓名的文本框
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setGeometry(QtCore.QRect(70, 20, 113, 20))
        self.lineEdit.setObjectName("lineEdit")
        # 添加 “年龄” 标签
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(30, 56, 42, 16))
        self.label_2.setObjectName("label_2")
        # 添加输入年龄的文本框
        self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_2.setGeometry(QtCore.QRect(70, 56, 113, 20))
        self.lineEdit_2.setObjectName("lineEdit_2")
        # 添加 “班级” 标签
        self.label_3 = QtWidgets.QLabel(self.centralwidget)
        self.label_3.setGeometry(QtCore.QRect(30, 90, 41, 16))
        self.label_3.setObjectName("label_3")
        # 添加输入班级的文本框
        self.lineEdit_3 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_3.setGeometry(QtCore.QRect(70, 90, 113, 20))
        self.lineEdit_3.setObjectName("lineEdit_3")
        # 添加 “分数” 标签
        self.label_4 = QtWidgets.QLabel(self.centralwidget)
        self.label_4.setGeometry(QtCore.QRect(30, 126, 41, 16))
        self.label_4.setObjectName("label_4")
        # 添加输入分数的文本框
        self.lineEdit_4 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_4.setGeometry(QtCore.QRect(70, 126, 113, 20))
        self.lineEdit_4.setObjectName("lineEdit_4")

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

        # 为 “姓名” 文本框的按Enter信号绑定槽函数,获取用户输入的姓名
        self.lineEdit.returnPressed.connect(self.getname)
        # 为 “年龄” 文本框的按Enter信号绑定槽函数,获取用户输入的年龄
        self.lineEdit_2.returnPressed.connect(self.getage)
        # 为 “班级” 文本框的按Enter信号绑定槽函数,获取用户选择的班级
        self.lineEdit_3.returnPressed.connect(self.getgrade)
        # 为 “分数” 文本框的按Enter信号绑定槽函数,获取用户输入的分数
        self.lineEdit_4.returnPressed.connect(self.getscore)

    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_3.setText(_translate("MainWindow", "班级:"))
        self.label_4.setText(_translate("MainWindow", "分数:"))

    # 自定义获取姓名的槽函数
    def getname(self):
        # 弹出可以输入字符串的输入框
        name, ok = QInputDialog.getText(MainWindow, "姓名", "请输入姓名", QtWidgets.QLineEdit.Normal, "明日科技")
        if ok:    # 判断是否单击的ok按钮
            self.lineEdit.setText(name)       # 获取输入对话框中的字符串,显示在文本框中

    # 自定义获取年龄的槽函数
    def getage(self):
        # 弹出可以选择或输入年龄的输入框
        age, ok = QInputDialog.getInt(MainWindow, "年龄", "请选择年龄", 20, 1, 100, 1)
        if ok:     # 判断是否单击了“OK”按钮
            self.lineEdit_2.setText(str(age))    # 获取输入对话框中的年龄,显示在文本框中

    # 自定义获取班级的槽函数
    def getgrade(self):
        # 弹出可以选择班级的输入框
        grade, ok = QInputDialog.getItem(MainWindow, "班级", "请选择班级", ("三年一班", "三年二班", "三年三班"), 0, False)
        if ok:         # 判断是否单击了“OK”按钮
            self.lineEdit_3.setText(grade)     # 获取输入对话框中选择的班级,显示在文本框中

    # 自定义获取分数的槽函数
    def getscore(self):
        # 弹出可以选择或输入分数的输入框,模板保留2位小数
        score, ok = QInputDialog.getDouble(MainWindow, "分数", "请选择分数", 0.01, 0, 100, 2)
        if ok:                      # 判断是否单击了 “OK”按钮
            self.lineEdit_4.setText(str(score))      # 获取输入对话框中的分数,显示在文本框中


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

运行程序,在相应文本框中按Enter键,即可弹出相应的输入框:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
      在弹出整数和小数输入框时,用户可以选择其中的值,也可以手动输入值,但不能超出设置的取值范围。

4. 字体和颜色对话框

      字体对话框、颜色对话框通常用来对文本的字体、颜色进行设置,在PyQt5中,使用QFontDialog类表示字体对话框,二而使用QColorDialog类表示颜色对话框

1. QFontDialog:字体对话框

      QFontDialog类表示字体对话框,用户可以从中选择字体的大小、样式、格式等信息,类似Word中的字体对话框。
      QFontDialog最常用的方法时getFont()方法,用来获取在字体对话框中选择的字体相关的信息,语法如下:

QFontDialog.getFont()

      该方法的返回值包含一个QFont对象和一个标识,其中QFont对象直接存储字体相关的信息,而标识用来确定是否正常返回,即是否单击了字体对话框中的OK按钮。

2. QColorDialog:颜色对话框

      QColorDialog类表示颜色对话框,用户可以从中选择颜色。
QColorDialog类最常用的方法是getColor()方法,用来获取在颜色对话框中选择的颜色信息,其语法如下:

QColorDialog.getColor()

      该方法的返回值是一个QColor对象,存储选择的颜色相关的信息。
      选择完颜色后,可用QColor对象的isValid()方法判断选择的颜色是否有效。

3. 字体和颜色对话框的使用

使用QFontDialog字体对话框和QColorDialog颜色对话框对TextEdit文本框中文字的字体和颜色进行设置。

示例:动态设置文本的字体和颜色

      使用Qt Designer设计器创建一个MainWindow窗口,其中添加两个PushButton控件、一个水平布局管理器和一个TextEdit控件。其中,两个PushButton控件分别用来执行设置字体和颜色的操作;水平布局管理器用来放置TextEdit控件,以便使该控件能自动适应大小;TextEdit控件用来输入文本,以便体现设置的字体和颜色。设计完成后保存为.ui文件,使用PyUIC工具将.ui文件转换为.py文件。
      在转换后的.py文件中,首先自定义两个槽函数setfont()和setcolor(),分别用来设置TextEdit控件中的字体和颜色;然后分别将这两个自定义的槽函数绑定到两个PushButton控件的clicked信号;最后为.py文件添加、__main__主方法。
完整代码如下:

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QFontDialog, QColorDialog

# # 设置的字体无法显示效果的解决办法:https://blog.youkuaiyun.com/weixin_41529093/article/details/120753637
# 实际上这里不需要这个设置,之前没有注意到,需要先选中文字后再来设置字体和颜色
# from PyQt5.QtWidgets import QApplication
# QApplication.processEvents()


class Ui_MainWidnow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(412, 166)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        # 添加 “设置字体” 按钮
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(10, 10, 75, 23))
        self.pushButton.setObjectName("pushButton")
        # 添加一个水平布局管理器,主要为了使TextEdit控件位于该区域中
        self.horizontalLayoutWidget = QtWidgets.QWidget(self.centralwidget)
        self.horizontalLayoutWidget.setGeometry(QtCore.QRect(10, 40, 401, 121))
        self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget)
        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout.setObjectName("horizontalLayout")
        # 添加标签控件,用来体现设置的字体和颜色
        self.textEdit = QtWidgets.QTextEdit(self.horizontalLayoutWidget)
        self.textEdit.setObjectName("label")
        self.horizontalLayout.addWidget(self.textEdit)
        # 添加 “设置颜色” 按钮
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(100, 10, 75, 23))
        self.pushButton_2.setObjectName("pushButton_2")

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

        # 为 “设置字体” 按钮的clicked信号关联槽函数
        self.pushButton.clicked.connect(self.setfont)
        # 为 “设置颜色” 按钮的clicked信号关联槽函数
        self.pushButton_2.clicked.connect(self.setcolor)

    def setfont(self):
        font, ok = QFontDialog.getFont()     # 字体对话框
        if ok:     # 如果选择了字体
            self.textEdit.setFont(font)     # 将选择的字体作为标签的字体

    def setcolor(self):
        color = QColorDialog.getColor()    # 颜色对话框
        # print("color:", color)
        if color.isValid():    # 判断颜色是否有效
            # print("color.isValid()", color.isValid())
            self.textEdit.setTextColor(color)     # 将选择的颜色作为标签的字体

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "设置字体"))
        self.textEdit.setText(_translate("MainWindow", "敢想敢为"))
        self.pushButton_2.setText(_translate("MainWindow", "设置颜色"))


# 主方法
if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWidnow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

      运行程序,单击“设置字体”按钮,在弹出的对话框中设置完字体后,单击OK按钮,即可将选择的字体应用于文本框中的文字。

在这里插入图片描述
在这里插入图片描述
      设置颜色时,首先需要选中要设置颜色的文字,然后单击“设置颜色”按钮,在弹出的对话框中选择颜色后,单击“OK”按钮,即可将选择的颜色应用于文本框中选中的文字。
在这里插入图片描述

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值