(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()
为什么这不起作用?
答案 0 :(得分:9)
您误解了QFileDialog
的工作原理。
函数getOpenFileName
,getSaveFileName
等 static 。他们创建了一个内部文件对话框对象,该函数的参数用于设置它的属性。
但是当您使用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_()
答案 1 :(得分:1)
全球解决方案就在这里。您可以获取目录,文件名和文件扩展名。你可以使用它:
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)]]