目录:

 一、对话框综合示例

二、QDialog

三、QInputDialog

四、QMessageDialog

五、QFileDialog

pyqt5的对话框有多种类型,比如输入对话框(QInputDialog)、颜色对话框(QColorDialog)、字体对话框(QFontDialog)、消息对话框(QMessageBox)、文件对话框(QFileDialog)等,他们都是Dialog的子类。

对话框的使用可以提高人机交互,方便用户输入数据,修改参数,改变设置,选择文件等。

一、对话框综合示例

下面,我们通过一个小例子初步了解各类对话框。首先需要说明下,所有的对话框默认为模态窗口,即用户必须处理完当前对话框之后,才可以与父窗口交互。

 import sys,os
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import (QWidget,QHBoxLayout,QPushButton,QTextEdit,QFontDialog, QApplication,
QColorDialog,QInputDialog,QVBoxLayout,QFileDialog,QMessageBox) path = os.path.dirname(os.path.dirname(os.path.dirname(__file__))) class MyWindow(QWidget):
def __init__(self):
super(MyWindow, self).__init__()
self.initUI() def initUI(self):
self.setWindowTitle('对话框示例')
self.setWindowIcon(QIcon(r'%s\4.图标素材\chuan.ico' % path))
self.setGeometry(600,300,500,400) '''创建三个按键,一个多行文本框'''
btn_input = QPushButton('输入')
btn_font = QPushButton('字体')
btn_color = QPushButton('颜色')
btn_file = QPushButton('文件')
self.text = QTextEdit() '''将三个按键布置在用一个水平布局容器中,然后将水平布局视为一个整体,与文本框布置在垂直布局中'''
hbx = QHBoxLayout()
hbx.addWidget(btn_input)
hbx.addWidget(btn_font)
hbx.addWidget(btn_color)
hbx.addWidget(btn_file) vbx = QVBoxLayout()
vbx.addLayout(hbx)
vbx.addWidget(self.text) self.setLayout(vbx) btn_input.clicked.connect(self.inputDialog)
btn_font.clicked.connect(self.fontDialog)
btn_color.clicked.connect(self.colorDialog)
btn_file.clicked.connect(self.fileDialog) def inputDialog(self):
text,ok = QInputDialog.getText(self,'输入文本框','请输入您的文本内容')
#返回值是一个包含两个元素的元组
if ok:
self.text.setText(text) def fontDialog(self):
font, ok = QFontDialog.getFont() #返回值是一个包含两个元素的元组
if ok:
self.text.setFont(font) def colorDialog(self):
color = QColorDialog.getColor()
if color.isValid: #通过isValid()可以判断用户选择的颜色是否有效,若用户选择取消,isValid()将返回false
self.text.setTextColor(color) def fileDialog(self):
'''打开单个文件'''
fname, _ = QFileDialog.getOpenFileName(self, '打开', '/home','Text Files (*.txt)')
# 返回值是包含2个元素的元组,但这里只需要第一个;这里还加了一个过滤器,只打开txt文件
if fname:
f = open(fname, 'r')
with f:
data = f.read()
self.text.setText(data) def closeEvent(self, QCloseEvent):
reply = QMessageBox.question(self,'消息框','您确认退出吗',QMessageBox.Yes|QMessageBox.No,QMessageBox.No)
if reply:
QCloseEvent.accept()
else:
QCloseEvent.ignore() if __name__ == '__main__':
app = QApplication(sys.argv)
win = MyWindow()
win.show()
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)当用户点击“颜色”对话框时,会弹出颜色对话框,该对话框有以下几种功能:

  1. 从基础颜色中选择需要的颜色;
  2. 从色谱图中选择所需颜色;
  3. 将喜欢的颜色添加到常用颜色中;
  4. 使用取色器在屏幕上取色;
  5. 微调三原色数值。

效果图及对应功能如下:

(4)当用户点击“文件”按键时,会弹出文件对话框。这里可以设置文件对话框弹出式父组件、标题、默认打开目录以及文件扩展名过滤器,后面会详细介绍。在当前示例中,只能打开单个文件,且只允许用户打开txt文件,并将文件内容写到文本框中。效果图如下:

(5)当用户退出主窗口时,会弹出消息框,不再详述,效果图如下:

二、QDialog

所有对话框窗体的标题栏上没有最小化和最大化控件,且默认为模态窗口。如果需要修改该属性,可调用setWindowModality()方法,取值如下:

  • Qt.NonModal。非模态,在未关闭对话框时,可以和程序的其他窗口进行交互;
  • Qt.WindowModal。模态窗口。用户必须处理完当前对话框,才可以和父窗口交互;
  • Qt.ApplicationModal。应用程序级模态,即用户在未处理完当前对话框时,不能和任何其他窗口进行交互。

用法如下

Dialog.setWindowModality(Qt.WindowModal)

三、QInputDialog

QInputDialog 控件是一个标准对话框,由一个输入文本框和两个按钮组成。可以从该对话框中获得字符串、数字和列表选项。常用方法如下:

  • getItem()。限制选择列表中已有选项
  • getDouble()。限制浮点数输入
  • getInt()。限制整数输入
  • getText()。获得字符串
 import sys,os
from PyQt5.QtWidgets import QWidget,QApplication,QInputDialog,QPushButton,QLineEdit,QHBoxLayout,QVBoxLayout
from PyQt5.QtGui import QIcon path = os.path.dirname(os.path.dirname(os.path.dirname(__file__))) class MyWindow(QWidget):
def __init__(self):
super(MyWindow, self).__init__()
self.initUI() def initUI(self):
self.setWindowTitle('QInputDialog示例')
self.setWindowIcon(QIcon(r'%s\4.图标素材\chuan.ico' % path))
self.setGeometry(600,300,350,200) btn_str = QPushButton('获得字符串')
btn_int = QPushButton('获得整数')
btn_item = QPushButton('获得列表选项')
self.lineEdit_str = QLineEdit()
self.lineEdit_int = QLineEdit()
self.lineEdit_item = QLineEdit() vbx1 = QVBoxLayout()
vbx1.addWidget(btn_int)
vbx1.addWidget(btn_item)
vbx1.addWidget(btn_str) vbx2 = QVBoxLayout()
vbx2.addWidget(self.lineEdit_int)
vbx2.addWidget(self.lineEdit_item)
vbx2.addWidget(self.lineEdit_str) hbx = QHBoxLayout()
hbx.addLayout(vbx1)
hbx.addLayout(vbx2)
self.setLayout(hbx) btn_item.clicked.connect(self.getItem)
btn_int.clicked.connect(self.getInt)
btn_str.clicked.connect(self.getStr) def getItem(self):
items = ['装载机','平地机','推土机','挖掘机','自卸车'] #这里设置成列表或元组都可以
item, ok = QInputDialog.getItem(self,'选择项目','请选择您的需求',items,0,False)
if ok and item:
self.lineEdit_item.setText(item) 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)) def getStr(self):
str, ok = QInputDialog.getText(self,'获取字符串','请输入您的文本',QLineEdit.Normal,'字符串',)
if ok:
self.lineEdit_str.setText(str) if __name__ == '__main__':
app = QApplication(sys.argv)
win = MyWindow()
win.show()
sys.exit(app.exec_())

QInputDialog示例

效果图如下:

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)

  1. 第一个参数为父组件;
  2. 第二个参数为对话框标题;
  3. 第三个参数为对话框提示信息;
  4. 第四个参数为默认值;
  5. 第五个参数为允许输入的最小值;
  6. 第六个参数为允许输入的最大值;
  7. 第七个参数为步长

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

 import sys,os
from PyQt5.QtWidgets import QWidget,QApplication,QMessageBox,QPushButton,QHBoxLayout,QVBoxLayout
from PyQt5.QtGui import QIcon path = os.path.dirname(os.path.dirname(os.path.dirname(__file__))) class MyWindow(QWidget): def __init__(self):
super(MyWindow, self).__init__()
self.initUI() def initUI(self):
self.setWindowTitle('QMessageDialog示例')
self.setWindowIcon(QIcon(r'%s\4.图标素材\chuan.ico' % path))
self.setGeometry(600,300,350,200) self.btn_question = QPushButton('问答对话框')
self.btn_warning = QPushButton('警告对话框')
self.btn_critical = QPushButton('严重错误对话框')
self.btn_about = QPushButton('关于对话框') vbx = QVBoxLayout()
vbx.addWidget(self.btn_about)
vbx.addWidget(self.btn_critical)
vbx.addWidget(self.btn_question)
vbx.addWidget(self.btn_warning) hbx = QHBoxLayout()
hbx.addStretch(1)
hbx.addLayout(vbx)
hbx.addStretch(1)
self.setLayout(hbx) self.btn_question.clicked.connect(self.showquestion)
self.btn_warning.clicked.connect(self.showwarning)
self.btn_critical.clicked.connect(self.showcritical)
self.btn_about.clicked.connect(self.showabout) def showquestion(self):
QMessageBox.question(self,'问答对话框','这是一个问答对话框',QMessageBox.Yes|QMessageBox.No,QMessageBox.Yes) def showwarning(self):
QMessageBox.warning(self, '警告对话框', '这是一个警告对话框', QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes) def showcritical(self):
QMessageBox.critical(self, '严重错误对话框', '这是一个严重错误对话框', QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes) def showabout(self):
QMessageBox.about(self, '关于对话框', '这是一个关于对话框') if __name__ == '__main__':
app = QApplication(sys.argv)
win = MyWindow()
win.show()
sys.exit(app.exec_())

QMessageDialog示例

效果图如下:

该窗体上共有四个按键,对应四种类型的消息对话框。

其中,问答对话框,警告对话框,严重错误对话框的方法相同,以问答对话框为例,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(父组件,标题,对话框打开时默认显示的目录,扩展名过滤器)。当扩展名过滤器需要显示多种文件类型时,各类型之间需要用两个分号隔开。示例如下

 import sys,os
from PyQt5.QtWidgets import QWidget,QApplication,QFileDialog,QPushButton,QTextEdit,QVBoxLayout
from PyQt5.QtGui import QIcon path = os.path.dirname(os.path.dirname(os.path.dirname(__file__))) class MyWindow(QWidget):
def __init__(self):
super(MyWindow, self).__init__()
self.initUI() def initUI(self):
self.setWindowTitle('QFileDialog示例')
self.setWindowIcon(QIcon(r'%s\4.图标素材\chuan.ico' % path))
self.setGeometry(600,300,350,200) btn = QPushButton('打开文件')
self.text = QTextEdit() vbx = QVBoxLayout()
vbx.addWidget(btn)
vbx.addWidget(self.text)
self.setLayout(vbx) btn.clicked.connect(self.openfile) def openfile(self):
fname, _ = QFileDialog.getOpenFileName(self,'打开文件','C:\\','TXT Files(*.txt);;DOC Files(*.docx)')
if fname:
f = open(fname, 'r')
with f:
data = f.read()
self.text.setText(data) if __name__ == '__main__':
app = QApplication(sys.argv)
win = MyWindow()
win.show()
sys.exit(app.exec_())

QFileDialog示例

效果图如下:


六、pyqt5对话框——QInputDialog、QColorDialog、QFontDialog、QMessageBox、QFileDialog的更多相关文章

  1. PyQt5对话框

    QinputDialog 输入的值可以是字符串,数字,或者一个项目从一个列表 def showDialog(self): text, ok = QInputDialog.getText(self, ' ...

  2. Qt__输入对话框(QInputDialog)

    #include <QInputDialog> ...... bool isOK; QString text = QInputDialog::getText(NULL, "Inp ...

  3. Qt标准对话框之QColorDialog

    Qt中提供了一些标准的对话框,用于实现一些常用的预定义功能,比如本节中将要介绍的颜色对话框——QColorDialog. 在不同的系统平台下,颜色对话框的显示效果可能会有所不同,主要因系统主题风格而异 ...

  4. PyQt5 对话框示例

    import sys from PyQt5.QtWidgets import * from PyQt5.QtGui import * class Example(QMainWindow): def _ ...

  5. MFC编程入门之十六(对话框:消息对话框)

    前面几节讲了属性页对话框,我们可以根据所讲内容方便的建立自己的属性页对话框.本节讲解Windows系统中最常用最简单的一类对话框--消息对话框. 我们在使用Windows系统的过程中经常会见到消息对话 ...

  6. Python脚本控制的WebDriver 常用操作 <十六> 处理对话框

    下面将使用webdriver来处理一些页面跳出的对话框事件 测试用例场景 页面上弹出的对话框是自动化测试经常会遇到的一个问题.前端框架的对话框经常是div形式的,下面是一些常见的对话框操作事件: 打开 ...

  7. 工作总结:VS2010/MFC编程入门之十六(对话框:消息对话框)

    原文地址:http://www.jizhuomi.com/software/171.html 我们在使用Windows系统的过程中经常会见到消息对话框,提示我们有异常发生或提出询问等.因为在软件开发中 ...

  8. 第三部分:Android 应用程序接口指南---第二节:UI---第六章 对话框

    第6章 对话框 一个对话框是一个小窗口,提示用户做出决定或输入额外的信息,一个对话框不填充屏幕并且通常用于在程序运行时中断,然后弹出通知提示用户,从而直接影响到正在运行的程序.图6-1就是对话框的外观 ...

  9. VS2010/MFC编程入门之十六(对话框:消息对话框)

    前面几节鸡啄米讲了属性页对话框,我们可以根据所讲内容方便的建立自己的属性页对话框.本节讲解Windows系统中最常用最简单的一类对话框--消息对话框. 我们在使用Windows系统的过程中经常会见到消 ...

随机推荐

  1. 分布式 基本理论 CAP 2

    关于P P, 即 Partition字面意思是网络分区,其实 包括了 各种网络问题, 我们要把它理解 一个 广义的 分区问题. P 涉及到了 时间, 这么说吧, 出现了分区, 那就是节点之间 “长久的 ...

  2. java web复习(二)

    三.四种属性范围及应用 setAttribute(String name,Object o)设置属性 getAttribute(String name)根据属性名取得属性 removeAttribut ...

  3. part1

    一.hello world 明确的指出 hello.py 脚本由 python 解释器来执行.coding:utf-8处理脚本中的中文 #!/usr/bin/env python # _*_ codi ...

  4. OpenStack构架简介

    OpenStack既是一个社区,也是一个项目和一个开源软件,提供开放源码软件,建立公共和私有云,它提供了一个部署云的操作平台或工具集,其宗旨在于:帮助组织运行为虚拟计算或存储服务的云,为公有云.私有云 ...

  5. [HTML]将错误alert出来[转]

    <script type="text/javascript"> /** * @param {String} errorMessage 错误信息 * @param {St ...

  6. 阿里云从0安装mysql到远程连接

    1.安装mysql数据库. (1)下载mysql源安装包:wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rp ...

  7. Javascript中用来实现继承的几种方式

    一.原型链继承 原理:修改子类型的原型,使其指向父类型的实例: 缺点: 1,不能以字面量方式在子类型的原型上添加新方法:这回重新改写子类型的原型: 2  创建子类型的实例时无法向父类型的构造函数传参. ...

  8. 解决matplotlib中文显示

    网上搜的很多方法都不是很好用,这里找到了一个比较好用的办法. 首先将win上的中文字体复制到linux目录下面,我这里使用的是simhei.ttf.然后参考如下代码的使用方式: import matp ...

  9. 第8章 IO库 自我综合练习

    要求: 文本内容: Tom  11144455 12345678998 Jone  88888888 99999999999 1.将文本文件中的内容读入,并显示到屏幕上: 2.手动输入“Mary 77 ...

  10. SpringBoot之Swagger2

    SpringBoot利用Swagger2只需配置少量的注解信息便能方便地构建强大的API文档. 1.添加maven依赖 2.创建Swagger2配置类 3.在API添加文档内容 4.访问http:// ...