PyQt5基本窗口控件(九)QDialog
九、对话框类控件
-
在PyQt 5中定义了一系列的标准对话框类,让使用者能够方便和快捷地通过各个类完成字号大小、字体颜色以及文件的选择等。
-
QDialog类的子类主要有QMessageBox.QFileDialog,QFontDialog ,QInputDialog等。
-
QDialog类中的常用方法
方法 | 描 述 | |
setWindowTitle | 设置对话框标题 | |
setWindowModality | 设置窗口模式,取值如下 | |
Qt.NonModal | 非模态,可以和程序的其他窗口交互 | |
Qt.WindowModal | 窗口模态,程序在未处理完当前对话框时,将阻止和对话框的父窗口进行交互 | |
Qt.ApplicationModal | 应用程序模态,阻止任何其他窗口进行交互 |
1、QDialog
案例二十 QDialog的使用
# -*- coding:utf-8 -*-
"""
# @Time:2022/12/9 0009 14:10
# @Author:晚秋拾叶
# @File:qt04_Dialog.py
# @PyCharm之Python
"""
import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
class DialogDemo(QMainWindow):
def __init__(self, parent=None):
super(DialogDemo, self).__init__(parent)
self.setWindowTitle("Dialog案例")
self.resize(350, 300)
self.btn = QPushButton(self)
self.btn.setText("弹出对话框")
self.btn.move(50, 50)
self.btn.clicked.connect(self.showdialog)
def showdialog(self):
dialog = QDialog()
btn = QPushButton("ok", dialog)
btn.move(50, 50)
dialog.setWindowTitle("Dialog")
dialog.setWindowModality(Qt.ApplicationModal)
dialog.exec_()
if __name__ == '__main__':
app = QApplication(sys.argv)
win = DialogDemo()
win.show()
sys.exit(app.exec_())
-
代码分析
-
在这个例子中,单击“弹出对话框”会弹出一个小对话框,程序是安排一个clicked信号连接到槽函数showdialog()完成。
self.btn.clicked.connect(self.showdialog)
-
Dialog窗口的WindowModality属性是窗口模态,本程序内的其他窗口也能操作。按下Esc键时,对话框默认调用QDialog.resize()方法,然后关闭小对话框。
dialog.setWindowModality(Qt.WindowModal)
-
-
效果如图
2、QMessageBox
-
QMessageBox是一种通用的弹出式对话框,用于显示消息,允许用户通过单击不同的标准按钮对消息进行反馈。每个标准按钮都有一个预定义的文本、角色和十六进制数。
-
QMessageBox类提供了许多常用的弹出式对话框,如提示、警告、错误、询问、关于等对话框。这些不同类型的QMessageBox对话框只是显示时的图标不同,其他功能是一样的。
-
QMessageBox类中的常用方法
方法 | 描 述 | |
information(QWidget,parent,title,text,buttons,defaultButton) | 弹出消息对话框,各参数解释如下: | |
parent | 指定的父窗口控件 | |
title | 对话框标题 | |
text | 对话框文本 | |
buttons | 多个标准按钮,默认为OK按钮 | |
defaultButton | 默认选中的标准按纽,默认是第一个标准按钮 | |
question(Qwidget parent,title, text, buttons, defaultButton) | 弹出问答对话框(各参数解释同上) | |
warning(QWidget parent,title, text, buttons, defaultButton) | 弹出警告对话框(各参数解释同上) | |
ctitical(QWidget parent,title, text, buttons , defaultButton) | 弹出严重错误对话框(各参数解释同上) | |
about(QWidget parent,titIe, text) | 弹出关于对话框(各参数解释同上) | |
setTitle() | 设置标题 | |
setText() | 设置消息正文 | |
setIcon() | 设置弹出对话框的图片 |
- QMessageBox的标准按钮类型
类型 | 描述 |
---|---|
QMessage.Ok | 同意操作 |
QMessage.Cancel | 取消操作 |
QMessage.Yes | 同意操作 |
QMessage.No | 取消操作 |
QMessage.About | 终止操作 |
QMessage.Retry | 重试操作 |
QMessage.Ignore | 忽略操作 |
- 5种常用的消息对话框及其显示效果
对话框类型 | 显示效果 |
---|---|
消息对话框,用来告诉用户关于提示消息QMessageBox.information(self,“标题”, “消息对话框正文”, QMessageBox.Yes |QMessageBox.No, QMessageBox.Yes) | |
消息对话框,用来告诉用户关于提示消息QMessageBox.information(self,“标题”, “提问框消息正文”, QMessageBox.Yes |QMessageBox.No, QMessageBox.Yes) | |
消息对话框,用来告诉用户关于提示消息QMessageBox.information(self,“标题”, “警告框消息正文”, QMessageBox.Yes |QMessageBox.No, QMessageBox.Yes) | |
消息对话框,用来告诉用户关于提示消息QMessageBox.information(self,“标题”, “严重错误对话框正文”, QMessageBox.Yes |QMessageBox.No, QMessageBox.Yes) | |
关于对话框QMessageBox.about(self,“标题”,“关于对话框”) |
案例二十一 QMessageBox的使用
import sys
from PyQt5.QtWidgets import *
class MyWindow(QWidget):
def __init__(self):
super(MyWindow, self).__init__()
self.setWindowTitle("QMessageBox案例")
self.resize(300, 100)
self.myButton = QPushButton(self)
self.myButton.setText("点击弹出消息框")
self.myButton.clicked.connect(self.msg)
def msg(self):
# information
reply = QMessageBox.information(self, "标题", "消息正文", QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes)
print(reply)
if __name__ == '__main__':
app = QApplication(sys.argv)
win = MyWindow()
win.show()
sys.exit(app.exec_())
- 效果如图
3、QInputDialog
- QInputDialog 控件是一个标准对话框,由一个文本框和两个按钮(OK 按钮和Cancel 按钮)组成。当用户单击OK按钮或按 Enter 键后,在父窗口可以收集通过QInputDialog控件输入的信息。QInputDialog 控件是QDialog标准对话框的一部分。
- 在 QInputDialog控件中可以输入数字、字符串或列表中的选项。标签用于提示必要的信息。
- QInputDialog类中的常用方法
方法 | 描述 |
---|---|
getInt() | 从控件中获得标准整数输入 |
getDouble() | 从控件中获得标准浮点数输入 |
getText() | 从控件中获得标准字符串输入 |
getItem() | 从控件中获得列表中的选项输入 |
案例二十二 QInputDialog的使用
# -*- coding:utf-8 -*-
"""
# @Time:2022/12/9 0009 16:18
# @Author:晚秋拾叶
# @File:qt04_QInputDialog.py
# @PyCharm之Python
"""
import sys
from PyQt5.QtWidgets import *
class InputDialogDemo(QWidget):
def __init__(self):
super().__init__()
FLayout = QFormLayout()
self.btn1 = QPushButton("获得列表中的选项")
self.btn1.clicked.connect(self.getItem)
self.le1 = QLineEdit()
FLayout.addRow(self.btn1, self.le1)
self.btn2 = QPushButton("获得字符串")
self.btn2.clicked.connect(self.getText)
self.le2 = QLineEdit()
FLayout.addRow(self.btn2, self.le2)
self.btn3 = QPushButton("获得整数")
self.btn3.clicked.connect(self.getInt)
self.le3 = QLineEdit()
FLayout.addRow(self.btn3, self.le3)
self.setLayout(FLayout)
self.setWindowTitle("Input Dialog 案例")
def getItem(self):
items = ("C", "C++", "Java", "Python")
item, ok = QInputDialog.getItem(self, "select input dialog", "语言列表", items, 0, False)
if ok and item:
self.le1.setText(item)
def getText(self):
text, ok = QInputDialog.getText(self, "Text Input Dialog", '输入姓名:')
if ok:
self.le2.setText(str(text))
def getInt(self):
num, ok = QInputDialog.getInt(self, "Integer input dialog", "输入数字")
if ok:
self.le3.setText(str(num))
if __name__ == '__main__':
app = QApplication(sys.argv)
win = InputDialogDemo()
win.show()
sys.exit(app.exec_())
-
代码分析
-
这个例子中,在QFormLayout布局器中放置了三个按钮和三个文本框。
-
当单击各个按钮时,将弹出标准对话框,再把按钮的单击信号与自定义的槽函数连接起来。
self.btn1.clicked.connect(self.getItem) self.btn2.clicked.connect(self.getText) self.btn3.clicked.connect(self.getInt)
-
三个按钮的槽函数都是对话框控件,分别调用getItem()、getText()和getInt()三种方法,获得想要的内容,写入到三个按钮右边的QLineEdit()文本框中。
-
-
效果如图
获得列表 | 获得字符串 | 获得整数 |
---|---|---|
4、QFontDialog
- QFontDialog 控件是一个常用的字体选择对话框,可以让用户选择所显示文本的字号大小、样式和格式。QFontDialog是 QDialog标准对话框的一部分。使用QFontDialog类的静态方法getFont(),可以从字体选择对话框中选择文本的显示字号大小、样式和格式。
案例二十三 QFontDialog的使用
# -*- coding:utf-8 -*-
"""
# @Time:2022/12/9 0009 17:12
# @Author:晚秋拾叶
# @File:qt04_FontDialog.py
# @PyCharm之Python
"""
import sys
from PyQt5.QtWidgets import *
class FontDialogDemo(QWidget):
def __init__(self, parent=None):
super(FontDialogDemo, self).__init__(parent)
self.resize(500, 300)
# 定义垂直布局器
VBlayout = QVBoxLayout()
self.fontButton = QPushButton("Choose font")
# 发射信号,调用字体设置器
self.fontButton.clicked.connect(self.getFont)
VBlayout.addWidget(self.fontButton)
# 定义标签,以便接收字体设置
self.fontLineEdit = QLabel("Hello , 测试字体案例")
VBlayout.addWidget(self.fontLineEdit)
self.setLayout(VBlayout)
self.setWindowTitle("Font Dialog案例")
# 定义槽函数调用字体设置对话框
def getFont(self):
font, ok = QFontDialog.getFont()
if ok:
self.fontLineEdit.setFont(font)
if __name__ == '__main__':
app = QApplication(sys.argv)
win = FontDialogDemo()
win.show()
sys.exit(app.exec_())
-
代码分析
-
在这个例子中,通过字体选择对话框选择相应的字体font,并且所选择的字体的效果显示在QLineEdit的文本上
-
实例化fontButton和fontLineEdit对象,并将fontButton的clicked信号和槽函数getFont()绑定在一起。
-
创建QVBoxLayout垂直布局,再把组件放入布局器,单击fontButton按钮时,clicked发送信号给getFont()槽函数,接着槽函数内部,再把fontLineEdit对象里面的字体设置为槽函数里面QfontDialog类产生的字体效果。
self.fontButton = QPushButton("Choose font") self.fontButton.clicked.connect(self.getFont) self.fontLineEdit = QLabel("Hello , 测试字体案例") def getFont(self): font, ok = QFontDialog.getFont() if ok: self.fontLineEdit.setFont(font)
-
-
效果如图
5、QFileDialog
-
QFileDialog是用于打开和保存文件的标准对话框。QFileDialog类继承自QDialog类。
-
QFileDialog在打开文件时使用了文件过滤器,用于显示指定扩展名的文件。也可以设置使用OFileDialog打开文件时的起始目录和指定扩展名的文件。
-
QFileDialog类中的常用方法
方法 | 描 述 | |
getOpenFileName() | 返回用户所选择的文件的名称,并打开该文件 | |
getSaveFileName() | 使用用户选择的文件名并保存文件 | |
setFileMode() | 可以选择的文件类型,枚举常量是: | |
QFileDialog.AnyFile | 任何文件 | |
QFileDialog.Directory | 文件目录 | |
QFileDialog.ExistingFile | 已存在的文件 | |
QFileDialog.ExistingFiles | 已经存在的多个文件 | |
setFileter() | 设置过滤器, 只显示过滤器允许的文件类型 |
案例二十四 QFileDialog的使用
# -*- coding:utf-8 -*-
"""
# @Time:2022/12/9 0009 18:12
# @Author:晚秋拾叶
# @File:qt04_QFileDialog.py
# @PyCharm之Python
"""
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class FileDialogDemo(QWidget):
def __init__(self, parent=None):
super(FileDialogDemo, self).__init__(parent)
# 定义一个垂直布局
VBlayout = QVBoxLayout()
self.btn = QPushButton("加载图片")
self.btn.clicked.connect(self.getfile)
VBlayout.addWidget(self.btn)
# 定义一个文本标签
self.le = QLabel("")
VBlayout.addWidget(self.le)
# 定义一个按钮
self.btn1 = QPushButton("加载文本文件")
self.btn1.clicked.connect(self.getfiles)
VBlayout.addWidget(self.btn1)
# 定义一个多行文本框
self.contents = QTextEdit()
VBlayout.addWidget(self.contents)
self.setLayout(VBlayout)
self.setWindowTitle("File Dialog 例子")
def getfile(self):
fName, _ = QFileDialog.getOpenFileName(self, 'Open file', 'd:\\', "Image files (*.jpg *.gif)")
self.le.setPixmap(QPixmap(fName))
def getfiles(self):
dlg = QFileDialog()
dlg.setFileMode(QFileDialog.AnyFile)
dlg.setFilter(QDir.Files)
if dlg.exec_():
filenames = dlg.selectedFiles()
f = open(filenames[0], 'r', encoding='UTF-8')
with f:
data = f.read()
self.contents.setText(data)
if __name__ == '__main__':
app = QApplication(sys.argv)
win = FileDialogDemo()
win.show()
sys.exit(app.exec_())
- 代码分析
- 在这个例子中,通过文件对话框选择文件,其中第一个文件对话框只允许打开图片文件,并把所加载的图片显示在标签(QLabel)中;第二个文件对话框只允许打开文件,并把文本内容显示在文本框(QTextEdit)内。
- 第一个按钮使用QFileDialog.getOpenFileName(),调用文件对话框来显示图像,并显示在一个标签控件中。它只负责打开C盘目录下的文件。其核心代码如下:
def getfile(self): fName, _ = QFileDialog.getOpenFileName(self, 'Open file', 'd:\\', "Image files (*.jpg *.gif)") self.le.setPixmap(QPixmap(fName))
- 在QFileDialog.getOpenFileName()函数中:
- 第一个参数用于指定父组类;
- 第二个参数是QFileDialog对话框的标题;
- 第三个参数是对话框显示时默认打开的目录;
- 第四个参数是对话框中文件扩展名过滤器(Filte)。
- 第二个按钮使用文件对话框(QFileDialog)对象的exec_()方法来选择文件,并把选择文件的内容显示在文本编辑框控件中。其核心代码是:
def getfiles(self): dlg = QFileDialog() dlg.setFileMode(QFileDialog.AnyFile) dlg.setFilter(QDir.Files) if dlg.exec_(): filenames = dlg.selectedFiles() f = open(filenames[0], 'r', encoding='UTF-8') with f: data = f.read() self.contents.setText(data)
- 效果如图