GUI学习之二十九—QFileDialog学习总结
今天学习的是文件对话框——QFileDialog
一.描述
QFileDialog提供了一个对话框,允许用户选择文件或者目录,也允许用户遍历文件系统,用以选择一个或多个文件或者目录。
QFileDialog继承了QDialog,具有父类的各种方法。
二.功能作用
1.最简单的获取方法(静态方法)
获取文件
QFileDialog.getOpenFileName() #获取一个打开文件的文件名 QFileDialog.getOpenFileNames() #获取多个打开文件的文件名 QFileDialog.getOpenFileUrl() #获取一个打开文件的统一资源定位符 QFileDialog.getOpenFileUrls() #获取多个打开文件的统一资源定位符 QFileDialog.getSaveFileName() #获取保存的文件名 QFileDialog.getSaveFileUrl() #获取保存的url
这些代码使用的方法基本一样,我们来演示一下
fd = QFileDialog.getOpenFileName(self,'选择一个py文件','./','ALL(*.*);;Images(*.png *.jpg);;Python文件(*.py)','Python文件(*.py)') print(fd)
下面介绍一下每个参数的意义:
self就不用说了,第一个‘选择一个py文件’是对话框的标题
'./'是打开对话框的默认地址
'ALL(*.*);;Images(*.png *.jpg);;Python文件(*.py)'是过滤字符串,定义了打开按钮上面的下拉框里的内容(文件类型),注意不同的文件类型之间是用两个分号隔开的。
'Python文件(*.py)'最后这个参数是初始的过滤值,就是对话框弹出时过滤出的文件类型。
最后运行的结果打印出了一个元组
('D:/python/PyQt_GUI/QFileDialog/1.py', 'Python文件(*.py)')
我们可以根据需求进行操作(元组的第2个元素是选择时候的过滤字符串)
用选择多个文件getOpenFileNames()的方法时,返回的元组的第一个元素是个列表,列表里的内容就是选择的文件。url地址的用法是一样的。但返回的元组的第一个元素是个PyQt5.QtCore.QUrl,我们可以直接拿来使用。
获取保存的文件名里的参数和获取打开文件名是一样的,不过弹框的效果不太一样
原先的过滤字符串编程了保存类型。但返回的值还是一样的。
获取文件夹
QFileDialog.getExistingDirectory()
QFileDialog.getExistingDirectoryUrl()
获取文件夹的参数比较简单,只需给定路径就可以(标题是可有可无的!)并且返回值直接就是个字符串(文件夹的路径)
但是获取文件夹Url的方法就有些区别,路径不能是一个简单的申明路径的字符串,而必须是个QUrl,并且标题也是必须要有的,返回值也是个QUrl对象。
fd = QFileDialog.getExistingDirectoryUrl(self,'选择一个文件夹',QUrl('./.'))
最后不从一下过滤字符串的格式
名称1(*.jpg *.png);;名称2(*.py)
比如名称1有两种以上格式的文件(jpg,png)就可以直接列出来以后用空格来分割,而名称1和名称2之间是需要两个分号来分割。
2.构造函数
大部分的场景用上面的静态方法都够用了,这里我们可以通过构造函数来使用。
from PyQt5.Qt import * import sys class Window(QWidget): def __init__(self): super().__init__() self.UI_test() def UI_test(self): btn = QPushButton('test',self) btn.clicked.connect(self.fun) def fun(self): fd = QFileDialog(self,'选择文件','../') fd.open() print('test') #运行代码可以通过这行代码发现对话框是个非阻塞的,如果想获得选择的文件就需要借助下面的信号 fd.fileSelected.connect(lambda file:print(file)) pass if __name__ == '__main__': app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_())
这里只讲了最基础的用法,后面可以结合一些方法来表现出不同的效果。
3.接收模式
因为QFileDialog分为打开和保存两种模式,默认情况是打开文件的。但是我们也可以通过下面的代码把他设置成为保存模式的。
QFileDialog.setAcceptMode(self, mode: 'QFileDialog.AcceptMode') AcceptOpen = ... # type: 'QFileDialog.AcceptMode' AcceptSave = ... # type: 'QFileDialog.AcceptMode'
4.默认后缀
如果我们希望文件名称是带有默认后缀的,可以用下面的方法
QFileDialog.setDefaultSuffix(self, suffix: str)
在显示效果里是文件名后是没有后缀的,但是返回的参数就加上了后缀名。
5.设置文件模式(文件/文件夹)
通过下面的方法可以设置要操作的对象是文件还是文件夹
QFileDialog.setFileMode(self, mode: 'QFileDialog.FileMode') #QFileDialog.FileMode中FileMode枚举值 # AnyFile 任意文件,无论是否存在 # ExistingFile 已存在的文件 # Directory 文件夹 # ExistingFiles 0个或多个现有文件 # DirectoryOnly 只能为目录
6.设置名称过滤器
QFileDialog.setNameFilters(self, filters: typing.Iterable[str])
QFileDialog.setNameFilter(self, filter: str)
注意如果是多个过滤器是迭代器的用法,用列表或元组就可以了,就可以不用前面说的用两个分号来分割。还有如果如果在构造函数里定义了过滤器,这里也设置了,那么是按这个过滤器来设置的。
7.信息显示的详细程度
QFileDialog.setViewMode(self, mode: 'QFileDialog.ViewMode') Detail = ... # type: 'QFileDialog.ViewMode' List = ... # type: 'QFileDialog.ViewMode'
但是这个设置在win10里是没有效果的,通过对话框里的显示图标就可以改了,可能后续的版本会改进吧。
8.指定的角色标签名称
我们可以对文件名、文件类型等标签的文本进行设置
QFileDialog.setLabelText(self, label: 'QFileDialog.DialogLabel', text: str) # LookIn = ... # type: 'QFileDialog.DialogLabel' # FileName = ... # type: 'QFileDialog.DialogLabel' # FileType = ... # type: 'QFileDialog.DialogLabel' # Accept = ... # type: 'QFileDialog.DialogLabel' # Reject = ... # type: 'QFileDialog.DialogLabel'
9.打开对话框
打开对话框除了前面用的open()以外,还可以通过由返回值的exec()来使用(和父类QDialog的返回方法是一样的)
三。常用信号
QFileDialog.currentChanged(self, path: str) #当前发生变化(参数为路径字符串) QFileDialog.currentUrlChanged(self, url: QtCore.QUrl) #当前发生变化(参数为Url) QFileDialog.directoryEntered(self, directory: str) #进入目录(参数为路径字符串) QFileDialog.directoryUrlEntered(self, directory: QtCore.QUrl) #进入目录(参数为Url) QFileDialog.filterSelected(self, filter: str) #名称字符串过滤器变化(参数为过滤器对应字符串) QFileDialog.fileSelected(self, file: str) QFileDialog.filesSelected(self, files: typing.Iterable[str]) QFileDialog.urlSelected(self, url: QtCore.QUrl) QFileDialog.urlsSelected(self, urls: typing.Iterable[QtCore.QUrl])
注意一下,1.当前发生变化是只要鼠标点中文件或文件夹就触发,而进入目录是必须进入到文件夹里才触发。