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

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

实战PyQt5: 057-文件对话框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())

运行结果如下图:

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

测试QFileDialog

本文知识点

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

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

  • 2
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值