目录:
一、对话框综合示例
二、QDialog
三、QInputDialog
四、QMessageDialog
五、QFileDialog
pyqt5的对话框有多种类型,比如输入对话框(QInputDialog)、颜色对话框(QColorDialog)、字体对话框(QFontDialog)、消息对话框(QMessageBox)、文件对话框(QFileDialog)等,他们都是Dialog的子类。
对话框的使用可以提高人机交互,方便用户输入数据,修改参数,改变设置,选择文件等。
一、对话框综合示例
下面,我们通过一个小例子初步了解各类对话框。首先需要说明下,所有的对话框默认为模态窗口,即用户必须处理完当前对话框之后,才可以与父窗口交互。
1 import sys,os 2 from PyQt5.QtGui import QIcon 3 from PyQt5.QtWidgets import (QWidget,QHBoxLayout,QPushButton,QTextEdit,QFontDialog, QApplication, 4 QColorDialog,QInputDialog,QVBoxLayout,QFileDialog,QMessageBox) 5 6 path = os.path.dirname(os.path.dirname(os.path.dirname(__file__))) 7 8 class MyWindow(QWidget): 9 def __init__(self): 10 super(MyWindow, self).__init__() 11 self.initUI() 12 13 def initUI(self): 14 self.setWindowTitle('对话框示例') 15 self.setWindowIcon(QIcon(r'%s\4.图标素材\chuan.ico' % path)) 16 self.setGeometry(600,300,500,400) 17 18 '''创建三个按键,一个多行文本框''' 19 btn_input = QPushButton('输入') 20 btn_font = QPushButton('字体') 21 btn_color = QPushButton('颜色') 22 btn_file = QPushButton('文件') 23 self.text = QTextEdit() 24 25 '''将三个按键布置在用一个水平布局容器中,然后将水平布局视为一个整体,与文本框布置在垂直布局中''' 26 hbx = QHBoxLayout() 27 hbx.addWidget(btn_input) 28 hbx.addWidget(btn_font) 29 hbx.addWidget(btn_color) 30 hbx.addWidget(btn_file) 31 32 vbx = QVBoxLayout() 33 vbx.addLayout(hbx) 34 vbx.addWidget(self.text) 35 36 self.setLayout(vbx) 37 38 btn_input.clicked.connect(self.inputDialog) 39 btn_font.clicked.connect(self.fontDialog) 40 btn_color.clicked.connect(self.colorDialog) 41 btn_file.clicked.connect(self.fileDialog) 42 43 def inputDialog(self): 44 text,ok = QInputDialog.getText(self,'输入文本框','请输入您的文本内容') 45 #返回值是一个包含两个元素的元组 46 if ok: 47 self.text.setText(text) 48 49 def fontDialog(self): 50 font, ok = QFontDialog.getFont() #返回值是一个包含两个元素的元组 51 if ok: 52 self.text.setFont(font) 53 54 def colorDialog(self): 55 color = QColorDialog.getColor() 56 if color.isValid: #通过isValid()可以判断用户选择的颜色是否有效,若用户选择取消,isValid()将返回false 57 self.text.setTextColor(color) 58 59 def fileDialog(self): 60 '''打开单个文件''' 61 fname, _ = QFileDialog.getOpenFileName(self, '打开', '/home','Text Files (*.txt)') 62 # 返回值是包含2个元素的元组,但这里只需要第一个;这里还加了一个过滤器,只打开txt文件 63 if fname: 64 f = open(fname, 'r') 65 with f: 66 data = f.read() 67 self.text.setText(data) 68 69 def closeEvent(self, QCloseEvent): 70 reply = QMessageBox.question(self,'消息框','您确认退出吗',QMessageBox.Yes|QMessageBox.No,QMessageBox.No) 71 if reply: 72 QCloseEvent.accept() 73 else: 74 QCloseEvent.ignore() 75 76 77 if __name__ == '__main__': 78 app = QApplication(sys.argv) 79 win = MyWindow() 80 win.show() 81 sys.exit(app.exec_())
效果图如下:
窗体上共有5个控件:4个按键,1个文本框。
def inputDialog(self):
text,ok = QInputDialog.getText(self,'输入文本框','请输入您的文本内容')
if ok:
self.text.setText(text)
(1) “输入”按键连接了inputDialog方法,当用户点击该按键时,会弹出输入文本框。输入文本框可以限制用户输入的内容。例如限制输入字符串,限制用户输入证书,或者限制用户只能从有限内容中选择。当前示例中用户输入的是字符串。其他几种类型后续会详细介绍。当然,用户也可以不通过该输入框直接在文本框内输入内容,这里只是为了做展示,所以“多此一举”。效果如如下:
(2)当用户点击“字体”按键时,可以从字体对话框中选择字体大小,样式和格式。效果图如下:
(3)当用户点击“颜色”对话框时,会弹出颜色对话框,该对话框有以下几种功能:
- 从基础颜色中选择需要的颜色;
- 从色谱图中选择所需颜色;
- 将喜欢的颜色添加到常用颜色中;
- 使用取色器在屏幕上取色;
- 微调三原色数值。
效果图及对应功能如下:
(4)当用户点击“文件”按键时,会弹出文件对话框。这里可以设置文件对话框弹出式父组件、标题、默认打开目录以及文件扩展名过滤器,后面会详细介绍。在当前示例中,只能打开单个文件,且只允许用户打开txt文件,并将文件内容写到文本框中。效果图如下:
(5)当用户退出主窗口时,会弹出消息框,不再详述,效果图如下:
二、QDialog
所有对话框窗体的标题栏上没有最小化和最大化控件,且默认为模态窗口。如果需要修改该属性,可调用setWindowModality()方法,取值如下:
- Qt.NonModal。非模态,在未关闭对话框时,可以和程序的其他窗口进行交互;
- Qt.WindowModal。模态窗口。用户必须处理完当前对话框,才可以和父窗口交互;
- Qt.ApplicationModal。应用程序级模态,即用户在未处理完当前对话框时,不能和任何其他窗口进行交互。
用法如下
Dialog.setWindowModality(Qt.WindowModal)
三、QInputDialog
QInputDialog 控件是一个标准对话框,由一个输入文本框和两个按钮组成。可以从该对话框中获得字符串、数字和列表选项。常用方法如下:
- getItem()。限制选择列表中已有选项
- getDouble()。限制浮点数输入
- getInt()。限制整数输入
- getText()。获得字符串
1 import sys,os 2 from PyQt5.QtWidgets import QWidget,QApplication,QInputDialog,QPushButton,QLineEdit,QHBoxLayout,QVBoxLayout 3 from PyQt5.QtGui import QIcon 4 5 path = os.path.dirname(os.path.dirname(os.path.dirname(__file__))) 6 7 class MyWindow(QWidget): 8 def __init__(self): 9 super(MyWindow, self).__init__() 10 self.initUI() 11 12 def initUI(self): 13 self.setWindowTitle('QInputDialog示例') 14 self.setWindowIcon(QIcon(r'%s\4.图标素材\chuan.ico' % path)) 15 self.setGeometry(600,300,350,200) 16 17 btn_str = QPushButton('获得字符串') 18 btn_int = QPushButton('获得整数') 19 btn_item = QPushButton('获得列表选项') 20 self.lineEdit_str = QLineEdit() 21 self.lineEdit_int = QLineEdit() 22 self.lineEdit_item = QLineEdit() 23 24 vbx1 = QVBoxLayout() 25 vbx1.addWidget(btn_int) 26 vbx1.addWidget(btn_item) 27 vbx1.addWidget(btn_str) 28 29 vbx2 = QVBoxLayout() 30 vbx2.addWidget(self.lineEdit_int) 31 vbx2.addWidget(self.lineEdit_item) 32 vbx2.addWidget(self.lineEdit_str) 33 34 hbx = QHBoxLayout() 35 hbx.addLayout(vbx1) 36 hbx.addLayout(vbx2) 37 self.setLayout(hbx) 38 39 btn_item.clicked.connect(self.getItem) 40 btn_int.clicked.connect(self.getInt) 41 btn_str.clicked.connect(self.getStr) 42 43 def getItem(self): 44 items = ['装载机','平地机','推土机','挖掘机','自卸车'] #这里设置成列表或元组都可以 45 item, ok = QInputDialog.getItem(self,'选择项目','请选择您的需求',items,0,False) 46 if ok and item: 47 self.lineEdit_item.setText(item) 48 49 def getInt(self): 50 # num,ok = QInputDialog.getDouble(self,'双精度','输入您得数字') 51 num, ok = QInputDialog.getInt(self,'获取整数','输入您的数字(-10~10)',0,-10,10,1) 52 if ok: 53 self.lineEdit_int.setText(str(num)) 54 55 def getStr(self): 56 str, ok = QInputDialog.getText(self,'获取字符串','请输入您的文本',QLineEdit.Normal,'字符串',) 57 if ok: 58 self.lineEdit_str.setText(str) 59 60 61 if __name__ == '__main__': 62 app = QApplication(sys.argv) 63 win = MyWindow() 64 win.show() 65 sys.exit(app.exec_())
效果图如下:
3.1 getItem()
def getItem(self): items = ['装载机','平地机','推土机','挖掘机','自卸车'] item, ok = QInputDialog.getItem(self,'选择项目','请选择您的需求',items,0,False) if ok and item: self.lineEdit_item.setText(item)
该方法限制用户只能在给定的有限内容中做选择。“有限的内容”即示例中的items,这里设置成列表或者元组都是可以的。其次,geiItem方法参数较多,下面进行讲解:
QInputDialog.getItem(QWidget, str, str, list-of-str, int current=0, bool editable=True)
参数依次为:父组件;对话框标题;对话框提示信息;列表对象;默认显示值在列表中的索引值;控件中显示的文字是否可编辑(True:可编辑;False:不可编辑)
3.2 getInt()和getDouble()
def getInt(self): # num,ok = QInputDialog.getDouble(self,'双精度','输入您得数字') num, ok = QInputDialog.getInt(self,'获取整数','输入您的数字(-10~10)',0,-10,10,1) if ok: self.lineEdit_int.setText(str(num))
getInt()和getDouble()使用方法是完全相同的。注意最后将输入值传给父组件时一定要把数据变为字符串。同样的,该方法参数众多,下面进行介绍:
QInputDialog.getInt(QWidget, str, str, int value=0, int min=-2147483647, int max=2147483647, int step=1)
- 第一个参数为父组件;
- 第二个参数为对话框标题;
- 第三个参数为对话框提示信息;
- 第四个参数为默认值;
- 第五个参数为允许输入的最小值;
- 第六个参数为允许输入的最大值;
- 第七个参数为步长
3.3 getText()
def getStr(self): str, ok = QInputDialog.getText(self,'获取字符串','请输入您的文本',QLineEdit.Normal,'字符串',) if ok: self.lineEdit_str.setText(str)
QInputDialog.getText(QWidget, str, str, QLineEdit.EchoMode echo=QLineEdit.Normal, str text=QString())
几个参数依次是:父组件;对话框标题;对话框提示信息;对话框中QLineEdit控件的输入模式;默认值。其中,对话框中QLineEdit控件的输入模式有4种,详情如下表:
常量 | 值 | 内容 |
QLineEdit.Normal | 0 | 正常显示输入的字符,默认选项。 |
QLineEdit.NoEcho | 1 | 不显示任何输入,常用于密码类型,其密码长度都需要保密的时候。 |
QLineEdit.Password | 2 | 显示平台相关的密码掩码字符,而不是实际的字符输入。 |
QLineEdit.PasswordEchoOnEdit | 3 | 在编辑的时候显示字符,负责显示密码类型。 |
四、QMessageDialog
1 import sys,os 2 from PyQt5.QtWidgets import QWidget,QApplication,QMessageBox,QPushButton,QHBoxLayout,QVBoxLayout 3 from PyQt5.QtGui import QIcon 4 5 path = os.path.dirname(os.path.dirname(os.path.dirname(__file__))) 6 7 class MyWindow(QWidget): 8 9 def __init__(self): 10 super(MyWindow, self).__init__() 11 self.initUI() 12 13 def initUI(self): 14 self.setWindowTitle('QMessageDialog示例') 15 self.setWindowIcon(QIcon(r'%s\4.图标素材\chuan.ico' % path)) 16 self.setGeometry(600,300,350,200) 17 18 self.btn_question = QPushButton('问答对话框') 19 self.btn_warning = QPushButton('警告对话框') 20 self.btn_critical = QPushButton('严重错误对话框') 21 self.btn_about = QPushButton('关于对话框') 22 23 vbx = QVBoxLayout() 24 vbx.addWidget(self.btn_about) 25 vbx.addWidget(self.btn_critical) 26 vbx.addWidget(self.btn_question) 27 vbx.addWidget(self.btn_warning) 28 29 hbx = QHBoxLayout() 30 hbx.addStretch(1) 31 hbx.addLayout(vbx) 32 hbx.addStretch(1) 33 self.setLayout(hbx) 34 35 self.btn_question.clicked.connect(self.showquestion) 36 self.btn_warning.clicked.connect(self.showwarning) 37 self.btn_critical.clicked.connect(self.showcritical) 38 self.btn_about.clicked.connect(self.showabout) 39 40 41 def showquestion(self): 42 QMessageBox.question(self,'问答对话框','这是一个问答对话框',QMessageBox.Yes|QMessageBox.No,QMessageBox.Yes) 43 44 def showwarning(self): 45 QMessageBox.warning(self, '警告对话框', '这是一个警告对话框', QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes) 46 47 def showcritical(self): 48 QMessageBox.critical(self, '严重错误对话框', '这是一个严重错误对话框', QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes) 49 50 def showabout(self): 51 QMessageBox.about(self, '关于对话框', '这是一个关于对话框') 52 53 54 if __name__ == '__main__': 55 app = QApplication(sys.argv) 56 win = MyWindow() 57 win.show() 58 sys.exit(app.exec_())
效果图如下:
该窗体上共有四个按键,对应四种类型的消息对话框。
其中,问答对话框,警告对话框,严重错误对话框的方法相同,以问答对话框为例,QMessageDialog.question(父组件,’对话框标题‘,’对话框内容‘,按键一|按键二,默认按键)。关于对话框只有一个按键ok,不需要用户指定按键,所以只需要给定前三项参数即可。在示例中,我们使用了Yes和No两个按键,实际上pyqt中案件类型不止这两种。
类型 | 作用 |
QMessage.Yes | 是 |
QMessage.No | 否 |
QMessage.Ok | 确认 |
QMessage.Cancel | 取消 |
QMessage.About | 关于 |
QMessage.Retry | 重试 |
QMessage.Ignore | 忽略 |
五、QFileDialog
QFileDialog是用于打开和保存文件的对话框,常用的方法如下:
方法 | 内容 |
getOpenFileName() | 返回所选文件的名称,并打开该文件(单个文件) |
getOpenFileNames() | 返回所选文件的名称,并打开该文件(多个文件) |
getSaveFileName() | 以用户选择的名称给文件命名 |
setFileMode() | 可以选择文件类型,枚举常量是: QFileDialog.AnyFile 任何文件 QFileDialog.ExistingFile 已存在的文件 QFileDialog.Directory 文件目录 QFileDialog.ExistingFiles 因存在的多个文件 |
setFilter | 设置过滤器,只显示过滤器允许的文件类型 |
综合示例中getOpenFileName()方法的各参数释义如下:
getOpenFileName(父组件,标题,对话框打开时默认显示的目录,扩展名过滤器)。当扩展名过滤器需要显示多种文件类型时,各类型之间需要用两个分号隔开。示例如下
1 import sys,os 2 from PyQt5.QtWidgets import QWidget,QApplication,QFileDialog,QPushButton,QTextEdit,QVBoxLayout 3 from PyQt5.QtGui import QIcon 4 5 path = os.path.dirname(os.path.dirname(os.path.dirname(__file__))) 6 7 class MyWindow(QWidget): 8 def __init__(self): 9 super(MyWindow, self).__init__() 10 self.initUI() 11 12 def initUI(self): 13 self.setWindowTitle('QFileDialog示例') 14 self.setWindowIcon(QIcon(r'%s\4.图标素材\chuan.ico' % path)) 15 self.setGeometry(600,300,350,200) 16 17 btn = QPushButton('打开文件') 18 self.text = QTextEdit() 19 20 vbx = QVBoxLayout() 21 vbx.addWidget(btn) 22 vbx.addWidget(self.text) 23 self.setLayout(vbx) 24 25 btn.clicked.connect(self.openfile) 26 27 def openfile(self): 28 fname, _ = QFileDialog.getOpenFileName(self,'打开文件','C:\\','TXT Files(*.txt);;DOC Files(*.docx)') 29 if fname: 30 f = open(fname, 'r') 31 with f: 32 data = f.read() 33 self.text.setText(data) 34 35 36 if __name__ == '__main__': 37 app = QApplication(sys.argv) 38 win = MyWindow() 39 win.show() 40 sys.exit(app.exec_())
效果图如下: