实战PyQt5: 057-文件对话框QFileDialog

QFileDialog简介

在前面的文章中,在保存和打开文件的时候,我们已经多次使用了QFileDialog,本文对QFileDialog相关功能做一详叙述。

QFileDialog控件提供了允许用户选择文件或者目录的对话框。它继承自QDialog, QFileDialog允许用户在文件系统上遍历来选择一个或多个文件或目录。QFileDialog在打开文件时可以使用文件过滤器,用于显示指定扩展名类型的文件,它也可以设置使用QFileDialog打开文件时的起始目录。

使用QFileDialog最简单的方法就是使用QFileDialog.getOpenFileName()来创建一个QFileDialog对话框实例。

1
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的返回值。

1
2
fd  = QFileDialog(self, 'file dialog', True)
fd.setMode(QFileDialog.AnyFile)

上述例子中,文件对话框的模式被设置为AnyFile,也就是说用户可以设置任何文件或者甚至指定一个不存在的文件。这种模式下创建一个“File Save As”文件对话框时。如果用户必须选择存在的文件,请使用ExistingFile,或者如果可以选择目录,请使用Directory。

可以使用setFilter()来设置对话框的文件过滤器

1
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类继承关系:

实战PyQt5: 057-文件对话框QFileDialog

测试QFileDialog

创建文件qfiledialog.py, 分别演示选择打开一个文件,选择打开多个文件,选择打开一个目录,选择保存一个文件, 并用QPlainTextEdit显示出来。

注: 在多选的情况下,请按住Ctrl或者Shift键。

完整代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
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())

运行结果如下图:

实战PyQt5: 057-文件对话框QFileDialog

测试QFileDialog

本文知识点

  • QFileDialog打开本地文件和远程文件;
  • QFileDialog打开目录;
  • QFileDialog打开多个文件;
  • QMenuBar和QStatusBar使用;
  • QPlainTextEdi显示文本信息。

前一篇: 实战PyQt5: 056-消息框QMessageBox