2015-01-16 4 views
1

(Windows 7 64 Bit, PyCharm 3.4.1 Pro, Python 3.4.0, PySide 1.2.2)Python PyQt PySide - setNameFilters в QFileDialog не работает

Я хочу сделать диалог сохранения файла с помощью фильтров и предварительного выбора один фильтр.

Если я использую статический метод, он работает, я могу использовать фильтры и предварительно выбрать один фильтр.

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() 

Почему это не работает?

enter image description here enter image description here

ответ

8

Вы не поняли хау 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_() 
+0

Большое спасибо! – Igor

+0

«... вы всегда получите встроенный диалог Qt-файла». Гектометр В Windows (см., Например, изображения в вопросе) оба диалога выглядят замечательно одинаково. Интересно, как получить диалог с неродным файлом и как его распознать? – Trilarion

+0

@Trilarion. Возможно, все изменилось, так как я ответил на это. Попробуйте: 'dialog.setOption (QFileDialog.DontUseNativeDialog)'. (PS: Я удалил эту часть ответа, потому что это не очень важно для вопроса). – ekhumoro

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)]]