[英]Python PyQt Pyside - setNameFilters in QFileDialog does not work
(Windows 7 64位,PyCharm 3.4.1 Pro,Python 3.4.0,PySide 1.2.2)
我想用過濾器創建一個文件對話框並預選一個過濾器。
如果我使用靜態方法,它可以工作,我可以使用過濾器並預先選擇一個過濾器。
dir = self.sourceDir
filters = "Text files (*.txt);;Images (*.png *.xpm *.jpg)"
selected_filter = "Images (*.png *.xpm *.jpg)"
fileObj = QFileDialog.getOpenFileName(self, " File dialog ", dir, filters, selected_filter)
如果我使用一個對象它不起作用,我的過濾器不存在。
file_dialog = QFileDialog(self)
file_dialog.setNameFilters("Text files (*.txt);;Images (*.png *.jpg)")
file_dialog.selectNameFilter("Images (*.png *.jpg)")
file_dialog.getOpenFileName()
為什么這不起作用?
您誤解了QFileDialog
工作原理。
函數getOpenFileName
, getSaveFileName
等是靜態的 。 它們創建一個內部文件對話框對象,該函數的參數用於設置它的屬性。
但是當您使用QFileDialog
構造函數時,它會創建一個外部實例,因此在其上設置屬性對靜態函數創建的內部文件對話框對象沒有影響。
您需要做的是顯示您創建的外部實例:
file_dialog = QFileDialog(self)
# the name filters must be a list
file_dialog.setNameFilters(["Text files (*.txt)", "Images (*.png *.jpg)"])
file_dialog.selectNameFilter("Images (*.png *.jpg)")
# show the dialog
file_dialog.exec_()
全球解決方案在這里。 您可以獲取目錄,文件名和文件擴展名。 你可以用它:
d = Dialog(self)
d.filters = ['A dosyaları (*.aaa)', 'B Dosyaları (*.bbb)', 'C Dosyaları (*.ccc)', 'Tüm Dosyalar (*.*)']
d.default_filter_index = 3
d.exec()
print(d.filename)
print(d.path)
和班級在這里!
from PyQt5.QtWidgets import QFileDialog, QDialog
import os
class Dialog():
def __init__(self, mainform):
self.__mainform = mainform
self.__dialog = QFileDialog()
self.__directory = ''
self.__filename = ['', '', '']
self.__filters = []
self.__default_filter_index = 0
self.__path = ''
@property
def path(self):
return self.__path
@property
def filename(self):
return self.__filename
@property
def directory(self):
return self.__directory
@directory.setter
def directory(self, value):
self.__directory = value
@property
def filters(self):
return self.__filters
@filters.setter
def filters(self, value):
self.__filters = value
@property
def default_filter_index(self):
return self.__default_filter_index
@default_filter_index.setter
def default_filter_index(self, value):
self.__default_filter_index = value
def exec(self, load =True):
self.__dialog.setNameFilters(self.__filters)
self.__dialog.selectNameFilter(self.__filters[self.__default_filter_index])
self.__dialog.setDirectory(self.__directory)
if load == True:
self.__dialog.setLabelText(QFileDialog.Accept, 'Aç')
self.__dialog.setWindowTitle('Aç')
else:
self.__dialog.setLabelText(QFileDialog.Accept, 'Kaydet')
self.__dialog.setWindowTitle('Kaydet')
if self.__dialog.exec() == QDialog.Accepted:
self.__path = self.__dialog.selectedFiles()[0]
fn = os.path.split(self.__path)
ex = os.path.splitext(self.__path)[1]
self.__filename = [fn[0], fn[1], ex[1:len(ex)]]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.