(五)对话框的使用
平时在使用各种软件或者网站时,经常会看到各种各样的对话框,有的对话框可以与用户进行交互,而有的只是显示一些提示信息。使用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()方法的参数说明
参数 | 说明 |
---|---|
QWidget | self或者窗口对象,表示该对话框所属的窗口。 |
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() |
|
setDefaultSuffix() | 设置文件对话框中的文件名的默认后缀名。 |
setFileMode() |
|
setDirectory() | 设置文件对话框的默认打开位置。 |
setNameFilter() | 设置名称过滤器,多个类型的过滤器之间用两个分号分割(例如:所有文件(*.*);;Python文件(*.py));而一个过滤器中如果有多种格式,可以用空格分割(例如:图片文件(*jpg *.png *.bmp)) |
setViewMode() |
|
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 | 父窗口对象 |
dglTitle | QInputDialog的标题 |
txtLabel | QInputDialog内部显示的文本 |
echoMode | 文本编辑框内容的显示方式 |
defaultInput | 文本编辑框默认显示内容 |
返回值 | 一个元组,其中text表示文本编辑框内的字符串,flag表示是否正常返回 |
2. getItem()方法
- 显示一个ComboBox下拉列表控件,用户可以从中选择数据。
text, flag = QInputDialog.getItem(QWidget, dlgTitle, txtLabel, items, curIndex, editable)
getItem()方法的参数及返回值说明
参数 | 说明 |
---|---|
QWidget | 父窗口对象 |
dglTitle | QInputDialog的标题 |
txtLabel | QInputDialog内部显示的文本 |
items | ComboBox组件的内容列表 |
curIndex | 默认显示ComboBox组件哪一个索引的内容 |
editable | ComboBox组件是否可被编辑 |
返回值 | 一个元组,其中text表示从ComboBox下拉列表中选择的内容,flag表示是否正常返回 |
3. getInt()方法
- 显示一个用于输入整数的编辑框,显示的是SpinBox控件。
inputValue,flag = QInputDialog.getInt(QWidget, dlgTitle, txtLabel, defaultValue, minValue, maxValue, stepValue)
getInt()方法的参数及返回值
参数 | 说明 |
---|---|
QWidget | 父窗口对象 |
dglTitle | QInputDialog的标题 |
txtLabel | QInputDialog内部显示的文本 |
defaultValue | SpinBox控件默认值 |
minValue | SpinBox控件最小值 |
maxValue | SpinBox控件最大值 |
stepValue | SpinBox控件单步值 |
返回值 | 一个元组,其中inputValue表示SpinBox中选择的整数值,flag表示是否正常返回 |
4. getDouble()方法
- 显示一个用于输入浮点数的编辑框,显示的是DoubleSpinBox控件。
inputValue, flag = QInputDialog.getDouble(QWidget, dlgTitle, txtLabel, defaultValue, minValue, maxValue, decimals)
getDouble()方法的参数及返回值
参数 | 说明 |
---|---|
QWidget | 父窗口对象 |
dglTitle | QInputDialog的标题 |
txtLabel | QInputDialog内部显示的文本 |
defaultValue | DoubleSpinBox控件默认值 |
minValue | DoubleSpinBox控件最小值 |
maxValue | DoubleSpinBox控件最大值 |
decimals | DoubleSpinBox控件显示的小数点位数控制 |
返回值 | 一个元组,其中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”按钮,即可将选择的颜色应用于文本框中选中的文字。