2015-01-16 3 views
1

(윈도우 7 64 비트, 프로 PyCharm 3.4.1, 파이썬 3.4.0, PySide 1.2.2)파이썬 PyQt는 Pyside - QFileDialog에 setNameFilters 내가 필터 파일 대화 상자를 만들고 싶어

작동하고 미리 선택하지 않습니다 하나의 필터.

정적 메서드를 사용하면 작동하며 필터를 사용할 수 있고 하나의 필터를 미리 선택할 수 있습니다.

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 작품을 오해 enter image description here

답변

8

enter image description here

.

기능은 정적입니다. 그들은 파일 대화 상자 개체를 만들고 함수에 대한 인수를 사용하여 속성을 설정합니다.

그러나 당신이 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

@ 필자 소개. 내가 대답 한 이후로 상황이 바뀔 수도 있습니다. 함께 시도 :'dialog.setOption (QFileDialog.DontUseNativeDialog)'. (추신 : 나는 그 질문에 정말로 관련이 없으므로 이제 그 부분을 제거했다.) – 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)]]