本文主要介绍PyQt界面实现中常用的消息弹出对话框、提供用户输入的输入框、打开文件获取文件/目录路径的文件对话框。学习这三种控件前,先想一下它们使用的主要场景:

1、消息弹出对话框。程序遇到问题需要退出需要弹出错误提示框 、程序执行可能造成的风险需要弹出警告窗口提示用户是否进一步执行等等。

2、用户输入框。比如常见的让用户选择执行的程序分支、yes/no等等。

3、文件对话框。获取本地文件或者文件夹的完整路径甚至是直接打开文件显示文件内容。

本文主要针对这三种控件的主要场景进行介绍。

1、QMessageBox:弹出消息对话框控件

QMessageBox是一种通用的弹出式对话框,用于显示消息,允许用户通过单击不同的标准按钮对消息进行反馈。弹出式对话框有很多类型,如提示、警告、错误、询问、关于等对话框。这些不同类型的QMessageBox对话框只是显示时图标不同,其他功能一样。

  QMessageBox类中常用方法

information(QWdiget parent,title,text,buttons,defaultButton):弹出消息对话框。

question(QWidget parent,title,text,buttons,defaultButton):弹出问答对话框

warning(QWidget parent,title,text,buttons,defaultButton):弹出警告对话框

critical(QWidget parent,title,text,buttons,defaultButton):弹出严重错误对话框

about(QWidget parent,title,text):弹出关于对话

参数解释如下:

parent:指定的父窗口控件。

title:表示对话框标题。

text:表示对话框文本。

buttons:表示多个标准按钮,默认为ok按钮。

defaultButton表示默认选中的标准按钮,默认选中第一个标准按钮。

其他方法如下:

setTitle():设置标题

setText():设置正文消息

setIcon():设置弹出对话框的图片

  QMessageBox的标准按钮类型

QMessage.Ok 同意操作、QMessage.Cancel  取消操作、QMessage.Yes  同意操作、QMessage.No  取消操作、QMessage.Abort  终止操作、QMessage.Retry 重试操作、QMessage.Ignore  忽略操作

  5种常用的消息对话框及其显示效果

    提前说明:from PyQt5.QtWidgets import QMessageBox 导入直接使用

(1)消息对话框,用来告诉用户关于提示信息

QMessageBox.information(self, '信息提示对话框','前方右拐到达目的地',QMessageBox.Yes | QMessageBox.No)

(2)提问对话框,用来告诉用户关于提问消息。

QMessageBox.question(self, "提问对话框", "你要继续搞测试吗?", QMessageBox.Yes | QMessageBox.No)

特别注意Tips: 对于提问对话框,需要根据用户选择Yes或者No进行下一步判断,可以获取按钮点击的返回值进行判断,选择NO的返回值为65536,选择Yes的返回值为其他。。示例如下:

(3)警告对话框,用来告诉用户关于不寻常的错误消息。

QMessageBox.warning(self, "警告对话框", "继续执行会导致系统重启,你确定要继续?", QMessageBox.Yes | QMessageBox.No)

(4)严重错误对话框,用来告诉用户关于程序执行失败的严重的错误消息。

QMessageBox.critical(self, "严重错误对话框", "数组越界,程序异常退出", QMessageBox.Yes | QMessageBox.No)

(5)关于对话框

QMessageBox.about(self, "关于对话框", "你的Windows系统是DOS1.0")

上述程序完整代码如下:

  1. # -*- coding: utf-8 -*-
  2.  
  3. import sys
  4. from PyQt5 import QtCore, QtGui, QtWidgets
  5. from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox
  6. class Ui_Form(object):
  7. def setupUi(self, Form):
  8. Form.setObjectName("Form")
  9. Form.resize(431, 166)
  10. self.pushButton = QtWidgets.QPushButton(Form)
  11. self.pushButton.setGeometry(QtCore.QRect(160, 50, 91, 41))
  12. font = QtGui.QFont()
  13. font.setFamily("YaHei Consolas Hybrid")
  14. font.setPointSize(10)
  15. self.pushButton.setFont(font)
  16. self.pushButton.setObjectName("pushButton")
  17.  
  18. self.retranslateUi(Form)
  19. QtCore.QMetaObject.connectSlotsByName(Form)
  20.  
  21. def retranslateUi(self, Form):
  22. _translate = QtCore.QCoreApplication.translate
  23. Form.setWindowTitle(_translate("Form", "对话框"))
  24. self.pushButton.setText(_translate("Form", "弹出对话框"))
  25.  
  26. class MyMainForm(QMainWindow, Ui_Form):
  27. def __init__(self, parent=None):
  28. super(MyMainForm, self).__init__(parent)
  29. self.setupUi(self)
  30. self.pushButton.clicked.connect(self.showMsg)
  31.  
  32. def showMsg(self):
  33. QMessageBox.information(self, '信息提示对话框','前方右拐到达目的地',QMessageBox.Yes | QMessageBox.No,QMessageBox.Yes)
  34. QMessageBox.question(self, "提问对话框", "你要继续搞测试吗?", QMessageBox.Yes | QMessageBox.No)
  35. QMessageBox.warning(self, "警告对话框", "继续执行会导致系统重启,你确定要继续?", QMessageBox.Yes | QMessageBox.No)
  36. QMessageBox.critical(self, "严重错误对话框", "数组越界,程序异常退出", QMessageBox.Yes | QMessageBox.No,)
  37. QMessageBox.about(self, "关于对话框", "你的Windows系统是DOS1.0")
  38.  
  39. if __name__ == "__main__":
  40. app = QApplication(sys.argv)
  41. myWin = MyMainForm()
  42. myWin.show()
  43. sys.exit(app.exec_())

运行结果(顺序弹出以下消息框)。

关键代码

2、QInputDialog标准对话框控件

QInputDialog控件是一个标准对话框,用于获取用户输入信息,QInputDialog控件可以提供数字、字符串输入或提供下拉列表选择。

针对QInputDialog对话框控件的使用,我们主要考虑2个问题:1、如何在弹出对话框供用户输入,2、如何获取用户输入。

  QInputDialog常用方法:

getint():从输入控件中获得标准整数输入

getDouble():从输入控件中获得标准浮点数输入

getText():从输入控件中获得标准字符串的输入

getItem() :从输入控件中获得列表里的选项输入

完整代码如下(代码可直接复制运行):

  1. # -*- coding: utf-8 -*-
  2.  
  3. import sys
  4. from PyQt5 import QtCore, QtGui, QtWidgets
  5. from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox,QInputDialog
  6.  
  7. class Ui_Form(object):
  8. def setupUi(self, Form):
  9. Form.setObjectName("Form")
  10. Form.resize(382, 190)
  11. font = QtGui.QFont()
  12. font.setPointSize(9)
  13. font.setBold(False)
  14. font.setWeight(50)
  15. Form.setFont(font)
  16. self.GetIntlineEdit = QtWidgets.QLineEdit(Form)
  17. self.GetIntlineEdit.setGeometry(QtCore.QRect(150, 30, 150, 31))
  18. self.GetIntlineEdit.setText("")
  19. self.GetIntlineEdit.setObjectName("GetIntlineEdit")
  20. self.GetstrlineEdit = QtWidgets.QLineEdit(Form)
  21. self.GetstrlineEdit.setGeometry(QtCore.QRect(150, 80, 150, 31))
  22. self.GetstrlineEdit.setObjectName("GetstrlineEdit")
  23. self.GetItemlineEdit = QtWidgets.QLineEdit(Form)
  24. self.GetItemlineEdit.setGeometry(QtCore.QRect(150, 130, 150, 31))
  25. self.GetItemlineEdit.setObjectName("GetItemlineEdit")
  26. self.getIntButton = QtWidgets.QPushButton(Form)
  27. self.getIntButton.setGeometry(QtCore.QRect(50, 30, 80, 31))
  28. self.getIntButton.setObjectName("getIntButton")
  29. self.getStrButton = QtWidgets.QPushButton(Form)
  30. self.getStrButton.setGeometry(QtCore.QRect(50, 80, 80, 31))
  31. self.getStrButton.setObjectName("getStrButton")
  32. self.getItemButton = QtWidgets.QPushButton(Form)
  33. self.getItemButton.setGeometry(QtCore.QRect(50, 130, 80, 31))
  34. self.getItemButton.setObjectName("getItemButton")
  35.  
  36. self.retranslateUi(Form)
  37. QtCore.QMetaObject.connectSlotsByName(Form)
  38.  
  39. def retranslateUi(self, Form):
  40. _translate = QtCore.QCoreApplication.translate
  41. Form.setWindowTitle(_translate("Form", "QInputDialog例子"))
  42. self.getIntButton.setText(_translate("Form", "获取整数"))
  43. self.getStrButton.setText(_translate("Form", "获取字符串"))
  44. self.getItemButton.setText(_translate("Form", "获取列表选项"))
  45.  
  46. class MyMainForm(QMainWindow, Ui_Form):
  47. def __init__(self, parent=None):
  48. super(MyMainForm, self).__init__(parent)
  49. self.setupUi(self)
  50. self.getIntButton.clicked.connect(self.getInt)
  51. self.getStrButton.clicked.connect(self.getStr)
  52. self.getItemButton.clicked.connect(self.getItem)
  53.  
  54. def getInt(self):
  55. num, ok = QInputDialog.getInt(self, 'Integer input dialog', '输入数字')
  56. if ok and num:
  57. self.GetIntlineEdit.setText(str(num))
  58.  
  59. def getStr(self):
  60. text, ok=QInputDialog.getText(self, 'Text Input Dialog', '输入姓名:')
  61. if ok and text:
  62. self.GetstrlineEdit.setText(str(text))
  63.  
  64. def getItem(self):
  65. items=('C', 'C++', 'C#', 'JAva', 'Python')
  66. item, ok=QInputDialog.getItem(self, "select input dialog", '语言列表', items, 0, False)
  67. if ok and item:
  68. self.GetItemlineEdit.setText(str(item))
  69.  
  70. if __name__ == "__main__":
  71. app = QApplication(sys.argv)
  72. myWin = MyMainForm()
  73. myWin.show()
  74. sys.exit(app.exec_())

运行结果如下(会陆续弹出三个输入对话框):

关键代码介绍:

QInputDialog.getInt(self, 'Integer input dialog', '输入数字') -> 输入整数对话框

QInputDialog.getText(self, 'Text Input Dialog', '输入姓名:') -> 输入字符串对话框

QInputDialog.getItem(self, "select input dialog", '语言列表', items, 0, False) -> 下拉列表选择对话框

3、QFileDialog 文件/目录选择对话框

QFileDialog是用于打开和保存文件的标准对话框。使用QFileDialog控件主要考虑2个场景:使用该控件提供用户选择目录或文件,并保存选择目录或文件的路径。简单说就是实现类似word/Notepad++文件打开功能。如下

针对上述场景,QFileDialog控件实现的主要方法

QFileDialog.getOpenFileName():获取单个文件路径

QFileDialog.getOpenFileNames():获取多个文件路径

QFileDialog.getExistingDirectory():获取文件夹路径

完整代码如下:

  1. # -*- coding: utf-8 -*-
  2.  
  3. import sys
  4. from PyQt5 import QtCore, QtGui, QtWidgets
  5. from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox,QInputDialog,QFileDialog
  6.  
  7. class Ui_Form(object):
  8. def setupUi(self, Form):
  9. Form.setObjectName("Form")
  10. Form.resize(443, 120)
  11. self.widget = QtWidgets.QWidget(Form)
  12. self.widget.setGeometry(QtCore.QRect(50, 40, 301, 25))
  13. self.widget.setObjectName("widget")
  14. self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget)
  15. self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
  16. self.horizontalLayout.setObjectName("horizontalLayout")
  17. self.openFileButton = QtWidgets.QPushButton(self.widget)
  18. self.openFileButton.setObjectName("openFileButton")
  19. self.horizontalLayout.addWidget(self.openFileButton)
  20. self.filePathlineEdit = QtWidgets.QLineEdit(self.widget)
  21. self.filePathlineEdit.setObjectName("filePathlineEdit")
  22. self.horizontalLayout.addWidget(self.filePathlineEdit)
  23.  
  24. self.retranslateUi(Form)
  25. QtCore.QMetaObject.connectSlotsByName(Form)
  26.  
  27. def retranslateUi(self, Form):
  28. _translate = QtCore.QCoreApplication.translate
  29. Form.setWindowTitle(_translate("Form", "QFileDialog打开文件例子"))
  30. self.openFileButton.setText(_translate("Form", "打开文件"))
  31.  
  32. class MyMainForm(QMainWindow, Ui_Form):
  33. def __init__(self, parent=None):
  34. super(MyMainForm, self).__init__(parent)
  35. self.setupUi(self)
  36. self.openFileButton.clicked.connect(self.openFile)
  37.  
  38. def openFile(self):
  39. get_directory_path = QFileDialog.getExistingDirectory(self,
  40. "选取指定文件夹",
  41. "C:/")
  42. self.filePathlineEdit.setText(str(get_directory_path))
  43.  
  44. get_filename_path, ok = QFileDialog.getOpenFileName(self,
  45. "选取单个文件",
  46. "C:/",
  47. "All Files (*);;Text Files (*.txt)")
  48. if ok:
  49. self.filePathlineEdit.setText(str(get_filename_path))
  50.  
  51. get_filenames_path, ok = QFileDialog.getOpenFileNames(self,
  52. "选取多个文件",
  53. "C:/",
  54. "All Files (*);;Text Files (*.txt)")
  55. if ok:
  56. self.filePathlineEdit.setText(str(' '.join(get_filenames_path)))
  57.  
  58. if __name__ == "__main__":
  59. app = QApplication(sys.argv)
  60. myWin = MyMainForm()
  61. myWin.show()
  62. sys.exit(app.exec_())

运行结果如下(会陆续弹出选择文件夹、选择单个文件、选择多个文件):

关键代码介绍

QFileDialog.getOpenFileName(self,"选取单个文件","C:/","All Files (*);;Text Files (*.txt)") -> 获取单个指定文件的绝对路径

getOpenFileName()参数说明:

第1个参数:用于指定父组件

第2个参数:对话框标题

第3个参数:对话框显示时默认打开的目录。"."表示当前程序所在目录,“/”表示当前盘下的根目录。

第4个参数:对话框中文件扩展名过滤器。All Files (*);;Text Files (*.txt)表示可以选择所有文件类型或者只显示.txt后缀的文件类型。

  QFileDialog.getExistingDirectory(self,"选取指定文件夹","C:/") -> 获取指定文件夹的绝对路径

QFileDialog.getOpenFileNames(self,"选取多个文件","C:/","All Files (*);;Text Files (*.txt)") -> 获取多个指定文件的绝对路径

小结

本文介绍了消息弹出对话框、用户输入对话框以及文件打开对话框的基本使用方法。内容覆盖了这三类控件的基本使用场景。可以开始动手尝试了。。

[ PyQt入门教程 ] PyQt5基本控件使用:消息弹出、用户输入、文件对话框的更多相关文章

  1. [ PyQt入门教程 ] PyQt5基本控件使用:单选按钮、复选框、下拉框

    本文主要介绍PyQt5界面最基本使用的单选按钮.复选框.下拉框三种控件的使用方法进行介绍. 1.RadioButton单选按钮/CheckBox复选框.需要知道如何判断单选按钮是否被选中. 2.Com ...

  2. [ PyQt入门教程 ] PyQt5环境搭建和配置

    PyQt入门系列教程主要目的是希望通过该系列课程学习,可以使用PyQt5工具快速实现简单的界面开发,包括界面设计.布局管理以及业务逻辑实现(信号与槽).简单说就是可以使用PyQt5工具快速画一个控件摆 ...

  3. [ PyQt入门教程 ] PyQt5中数据表格控件QTableWidget使用方法

    如果你想让你开发的PyQt5工具展示的数据显得整齐.美观.好看,显得符合你的气质,可以考虑使用QTableWidget控件.之前一直使用的是textBrowser文本框控件,数据展示还是不太美观.其中 ...

  4. [ PyQt入门教程 ] PyQt5信号与槽

    信号和槽是PyQt编程对象之间进行通信的机制.每个继承自QWideget的控件都支持信号与槽机制.信号发射时(发送请求),连接的槽函数就会自动执行(针对请求进行处理).本文主要讲述信号和槽最基本.最经 ...

  5. LVGL库入门教程02-基本控件与交互

    LVGL 本质上是一个 GUI 库,它包含大量的控件(widget),即按钮.标签.滑块.菜单栏这种具有一定人机交互特征的组合图形.LVGL 在设计时,采用了一定面向对象编程的设计思路,有效降低了代码 ...

  6. bootstrop 日期控件 datepicker被弹出框dialog覆盖的解决办法

    筒子们在使用bootstrap的日期控件(datepicker , 现在官网提供的名称叫 datetimepicker)时可能会遇到如上图的问题这是啥原因造成的呢? 答案很简单时输出的优先级造成的(z ...

  7. 如何去除My97 DatePicker控件上右键弹出官网的链接 - 如何debug混淆过的代码

    概述 http://my97.net/是一个web浏览器的日期选择控件,非常好用,做得非常棒,各种API等事件等都很方便,但是使用了4.8beta3之后,在控件上面右击会出现官网链接 ,这个是PM以及 ...

  8. UITextField控件处理键盘弹出时遮住输入框的问题

    原文连接: http://www.devdiv.com/thread-70159-1-1.html 实现以下三个方法,如果弹出的键盘会遮住输入框 ,整体的界面会向上移动,这样就不会遮住输入框了.自己增 ...

  9. ASP.Net UpdatePanel控件 局部刷新 && 弹出提示信息

    参考博客: https://blog.csdn.net/qq_35019337/article/details/69972552 https://blog.csdn.net/huangyezi/art ...

随机推荐

  1. Go - Struct 结构体

    目录 概述 声明结构体 生成 JSON 改变数据 推荐阅读 概述 结构体是将零个或多个任意类型的变量,组合在一起的聚合数据类型,也可以看做是数据的集合. 声明结构体 //demo_11.go pack ...

  2. 对于BIO/NIO/AIO,你还只停留在烧开水的水平吗?

    1.发发牢骚 相信大家在网上看过不少讲解 BIO/NIO/AIO 的文章,文章中举起栗子来更是夯吃夯吃一大堆,我是越看越觉得 What are you 你讲啥嘞? 本文将针对 BIO/NIO/AIO ...

  3. Postman接口测试_基本功能

    一.   安装与更新 1.安装的方式 方式1:chrome插件版本:chrome--->设置--->扩展程序: 方式2:native版本(具有更好的扩展性,推荐使用):https://ww ...

  4. HDU 1542:Atlantis(扫描线+线段树 矩形面积并)***

    题目链接 题意 给出n个矩形,求面积并. 思路 使用扫描线,我这里离散化y轴,按照x坐标从左往右扫过去.离散化后的y轴可以用线段树维护整个y上面的线段总长度,当碰到扫描线的时候,就可以统计面积.这里要 ...

  5. CodeForces 696A:Lorenzo Von Matterhorn(map的用法)

    http://codeforces.com/contest/697/problem/C C. Lorenzo Von Matterhorn time limit per test 1 second m ...

  6. Spring Boot 最流行的 16 条实践解读,你值得收藏!

    Spring Boot是最流行的用于开发微服务的Java框架.在本文中,我将与你分享自2016年以来我在专业开发中使用Spring Boot所采用的最佳实践.这些内容是基于我的个人经验和一些熟知的Sp ...

  7. 基于SpringCloud的Microservices架构实战案例-架构拆解

    自第一篇< 基于SpringCloud的Microservices架构实战案例-序篇>发表出来后,差不多有半年时间了,一直也没有接着拆分完,有如读本书一样,也是需要契机的,还是要把未完成的 ...

  8. vue组件间通信六种方式(完整版)

    本文总结了vue组件间通信的几种方式,如props. $emit/ $on.vuex. $parent / $children. $attrs/ $listeners和provide/inject,以 ...

  9. 宏旺半导体深度剖析嵌入式存储芯片eMMC原理 一篇概括大全

    eMMC 一直是嵌入式存储市场最主流的选择,除了读写速度快.性价比高外,在节省空间方面也是相当优秀,今天宏旺半导体就和大家详细聊聊eMMC. eMMC 是 embedded MultiMediaCar ...

  10. Fiolki题解

    问题 B: Fiolki 时间限制: 3 Sec  内存限制: 128 MB 题目描述 化学家吉丽想要配置一种神奇的药水来拯救世界. 吉丽有n种不同的液体物质,和n个药瓶(均从1到n编号).初始时,第 ...