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