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.當前發生變化是只要鼠標點中文件或文件夾就觸發,而進入目錄是必須進入到文件夾里才觸發。

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM