QFileDialog简介
在前面的文章中,在保存和打开文件的时候,我们已经多次使用了QFileDialog,本文对QFileDialog相关功能做一详叙述。
QFileDialog控件提供了允许用户选择文件或者目录的对话框。它继承自QDialog, QFileDialog允许用户在文件系统上遍历来选择一个或多个文件或目录。QFileDialog在打开文件时可以使用文件过滤器,用于显示指定扩展名类型的文件,它也可以设置使用QFileDialog打开文件时的起始目录。
使用QFileDialog最简单的方法就是使用QFileDialog.getOpenFileName()来创建一个QFileDialog对话框实例。
path = QFileDialog.getFileName('/home', 'Images (*.png *.xpm *.jpg)', self, 'Open file dialog' ,'Choose a file')
上述例子中,创建一个模态对话框,开始目录设置为'/home'。文件过滤器设置为'Images(*.png *.xpm *.jpg)'。文件对话框的父对象被设置为self并且指定一个标题文本'Open file dialog'。文件对话框的标题被设置为'Choose a file'。
当然也可以直接使用QFileDialog来创建实例,通过设置setMode(),您可以指定QFileDialog的返回值。
fd = QFileDialog(self, 'file dialog', True)
fd.setMode(QFileDialog.AnyFile)
上述例子中,文件对话框的模式被设置为AnyFile,也就是说用户可以设置任何文件或者甚至指定一个不存在的文件。这种模式下创建一个“File Save As”文件对话框时。如果用户必须选择存在的文件,请使用ExistingFile,或者如果可以选择目录,请使用Directory。
可以使用setFilter()来设置对话框的文件过滤器
fd.setFilter('Images (*.png *.xpm *.jpg)')
在上述例子中过滤器被设置为'Images (*.png *.xpm *.jpg)',这也就是说只有扩展名为png、xpm或jpg的文件可以被显示在QFileDialog中。你可以使用setFilters()来设置几个过滤器并且使用addFilter()来添加额外的过滤器。使用setSelectedFilter()来选择你给定的其中一个作为文件对话框默认过滤器。
文件对话框有两种视图模式, QFileDialog.List可以简单地列出文件和目录名称; QFileDialog则会在文件旁边显示额外的信息(比如 文件大小)。使用方法setViewMode来设置视图模式。
QFileDialog中使用两种预览窗口部件:内容预览窗口部件和信息预览窗口部件,分别由方法setContentsPreview()和setInfoPreview()来创建。预览窗口部件被放置在QFileDialog中,让用户能够看到文件的内容或者有关文件的信息。
QFileDialog常用方法有:
- getOpenFileName(): 获取本地文件路径;
- getOpenFileNames(): 获取多个本地文件路径;
- getOpenFileUrl(): 获取远程文件路径;
- getOpenFileUrls(): 获得多个远程文件路径;
- getExistingDirectory(): 获得文件夹路径;
- getExistingDirectoryUrl(): 和getExistingDirectory类似,功能也是获取文件夹路径,最大的区别在于参数里的路径是QUrl类型,这为用户提供了选择远程目录的能力;
- getSaveFileName(): 本地文件保存对话框;
- getSaveFileUrl(): 远程文件保存对话框;
- setAcceptMode(): 设置是打开还是保存文件对话框(QFileDialog.AcceptOpen: 文件对话框为打开类型; QFileDialog.AcceptSave: 文件对话框为保存类型);
- setViewMode(): 设置视图模式(QFileDialog.Detail: 显示文件和目录的名称和图标以及更多的信息,比如文件的大小和修改日期;QFileDialog.List: 显示文件和目录的名称和图标);
- setFilter(): 设置文件类型过滤器,只有包含在括号内的内容才会作为过滤器,后缀之间由空格或者分号分隔;
- setFileMode(): 设置文件模式,设置可操作的对象是文件还是文件夹。(QFileDialog.AnyFile: 任意文件,无论是否存在; QFileDialog.ExistingFile: 已存在的文件; QFileDialog.Directory: 文件夹; QFileDialog.ExistingFiles: 0个或多个现有文件;QFileDialog.DirectoryOnly:只能为目录;
- setLabelText(): 设置指定角色的标签名称,通过它,我们可以对文件名、文件类型等标签的文本进行设置。(QFileDialog.LookIn, QFileDialog.FileName, QFileDialog.FileType, QFileDialog.Accept, QFileDialog.Reject)
- setDefaultSuffix(): 设置默认后缀;
- selectedFile(): 返回选择的文件名称;
- dir(): 返回文件对话框中显示的当前目录;
- dirPath(): 返回文件对话框的工作目录。
QFileDialog常用信号:
- dirEntered: 当用户进入一个目录时,该信号被发射;
- fileHighlighted: 当用户高亮显示一个文件时,该信号被发射;
- fileSelected: 当用户选择一个文件时,该信号被发射;
- filesSelected: 当用户在ExistingFiles模式下选择一个或多个文件时,该信号被发射;
- filterSelected: 当用户选择一个过滤器时,该信号被发射;
QFileDialog类继承关系:
测试QFileDialog
创建文件qfiledialog.py, 分别演示选择打开一个文件,选择打开多个文件,选择打开一个目录,选择保存一个文件, 并用QPlainTextEdit显示出来。
注: 在多选的情况下,请按住Ctrl或者Shift键。
完整代码如下:
import sys,os
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import (QApplication, QMainWindow, QMenuBar, QMenu,
QAction, QFileDialog, QStatusBar, QPlainTextEdit)
class DemoFileDialog(QMainWindow):
def __init__(self, parent=None):
super(DemoFileDialog, self).__init__(parent)
# 设置窗口标题
self.setWindowTitle('实战PyQt5: QFileDialog Demo!')
# 设置窗口大小
self.resize(480, 270)
self.cwd = os.getcwd()
self.initUi()
def initUi(self):
#为主窗口添加状态条
self.statusBar = QStatusBar(self)
self.setStatusBar(self.statusBar)
#菜单条
menuBar = self.menuBar()
menuFile = menuBar.addMenu('文件')
#选择一个文件
aFileChoose = QAction('选择一个文件...', self)
aFileChoose.triggered.connect(self.onFileChoose)
#选择多个文件
aFileMultiChoose = QAction('选择多个文件...', self)
aFileMultiChoose.triggered.connect(self.onFileMultiChoose)
#选择文件夹
aFileChooseDir = QAction('选择一个文件夹...', self)
aFileChooseDir.triggered.connect(self.onFileChooseDir)
#文件保存
aFileSave = QAction('文件保存...', self)
aFileSave.triggered.connect(self.onFileSave)
menuFile.addAction(aFileChoose)
menuFile.addAction(aFileMultiChoose)
menuFile.addAction(aFileChooseDir)
menuFile.addAction(aFileSave)
#退出菜单
aFileExit = QAction('退出', self)
aFileExit.triggered.connect(self.close)
menuFile.addSeparator()
menuFile.addAction(aFileExit)
self.showInfo = QPlainTextEdit(self)
self.showInfo.setReadOnly(True)
self.showInfo.setLineWrapMode(QPlainTextEdit.WidgetWidth)
self.setCentralWidget(self.showInfo)
def onFileChoose(self):
filename, filetype = QFileDialog.getOpenFileName(self, '选择文件',
self.cwd, #起始路径
'Text Files(*.txt);;All Files(*)') #文件扩展名过滤器
if filename=='':
self.statusBar.showMessage('取消选择', 2000)
return
self.showInfo.appendPlainText('你选择的文件为:{}\n文件筛选器类型为:{}'.format(filename, filetype))
def onFileMultiChoose(self):
filenames,filetye = QFileDialog.getOpenFileNames(self,
'多文件选择',
self.cwd,
'PDF Files (*.pdf);;Text Files (*.txt);;All Files (*.*)')
if len(filenames) == 0:
self.statusBar.showMessage('取消选择', 2000)
return
self.showInfo.appendPlainText('你选择的文件为:')
for filename in filenames:
self.showInfo.appendPlainText(filename)
self.showInfo.appendPlainText('文件筛选器类型为: ' + filetye)
def onFileChooseDir(self):
dir_choose = QFileDialog.getExistingDirectory(self,
'选择文件夹',
self.cwd)
if dir_choose == '':
self.statusBar.showMessage('取消选择', 2000)
return
self.showInfo.appendPlainText('你选择的文件夹为:{}'.format(dir_choose))
def onFileSave(self):
filename,filetype = QFileDialog.getSaveFileName(self,
'文件保存',
self.cwd,
'PDF Files (*.pdf);;Text Files (*.txt);;All Files (*.*)')
if filename=='':
self.statusBar.showMessage('取消选择', 2000)
return
self.showInfo.appendPlainText('你选择的保存文件为:{}'.format(filename))
self.showInfo.appendPlainText('文件筛选器类型:'+filetype)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = DemoFileDialog()
window.show()
sys.exit(app.exec())
运行结果如下图:
测试QFileDialog
本文知识点
- QFileDialog打开本地文件和远程文件;
- QFileDialog打开目录;
- QFileDialog打开多个文件;
- QMenuBar和QStatusBar使用;
- QPlainTextEdi显示文本信息。