2012-11-06 2 views
1

QFileDialog의 경우 파일 또는 디렉토리 중 하나를 선택 가능하게 할 수 있습니까? 사용자가 동일한 UI에서 필터 및 파일 목록 업데이트 중 다른 파일 유형을 선택하는 방식으로 사용자에게 제공됩니다.'파일 전용'또는 '디렉토리 전용'을 허용하는 QFileDialog를 사용할 수 있습니까?

+0

적어도 서브 클래 싱 없이는 그렇게 생각하지 않습니다. 그렇더라도 지루할 것이라고 기대합니다. – Anthony

답변

1

:

마지막으로, QFileDialog의 파일 모드를 변경하는 함수를 호출하는 버튼을 추가 (또는 확인란) 해결책. 기본적으로 위젯 (이 상자에 적합한 체크 상자)을 추가하고 파일 대화 상자에 연결하면 작업이 수행됩니다.

(실제로 다른 사람이 대답을 향상 시켰습니다. &) 감사합니다. 여기에 다른 사람이 걸려 넘어지면 여기에 답변을 게시하십시오.)

from sys import argv 

from PySide import QtGui, QtCore 


class MyDialog(QtGui.QFileDialog): 
    def __init__(self, parent=None): 
     super (MyDialog, self).__init__() 
     self.init_ui() 

    def init_ui(self): 
     cb = QtGui.QCheckBox('Select directory') 
     cb.stateChanged.connect(self.toggle_files_folders) 
     self.layout().addWidget(cb) 

    def toggle_files_folders(self, state): 
     if state == QtCore.Qt.Checked: 
      self.setFileMode(self.Directory) 
      self.setOption(self.ShowDirsOnly, True) 
     else: 
      self.setFileMode(self.AnyFile) 
      self.setOption(self.ShowDirsOnly, False) 
      self.setNameFilter('All files (*)') 


def main(): 
    app = QtGui.QApplication(argv) 
    dialog = MyDialog() 
    dialog.show() 
    raise SystemExit(app.exec_()) 


if __name__ == '__main__': 
    main() 
0

예, 그렇습니다. 여기에 한 가지 방법입니다 :

헤더에서, 당신의 QFileDialog 포인터 선언 구현에서

class buggy : public QWidget 
{ 
    Q_OBJECT 
public: 
    buggy(QWidget *parent = 0); 
    QFileDialog *d; 
public slots: 
    void createDialog(); 
    void changeDialog(); 
}; 

을의 QFileDialog::DontUseNativeDialog 옵션 (당신이 맥 OS에서이 작업을 수행해야합니다 설정,하지만 난 다른 곳을 테스트하지 않았습니다), 적절한 창 플래그를 재정의하여 원하는대로 대화 상자를 표시하십시오. 나는 몇 가지 조사를 수행하고 내가 쉽게 발견 IRC의 PPL에서 약간의 도움으로 한

buggy::buggy(QWidget *){ 
    //Ignore this, as its just for example implementation 
    this->setGeometry(0,0,200,100); 
    QPushButton *button = new QPushButton(this); 
    button->setGeometry(0,0,100,50); 
    button->setText("Dialog"); 
    connect(button, SIGNAL(clicked()),this,SLOT(createDialog())); 
    //Stop ignoring and initialize this variable 
    d=NULL; 
} 
void buggy::createDialog(void){ 
     d = new QFileDialog(this); 
     d->setOption(QFileDialog::DontUseNativeDialog); 
     d->overrideWindowFlags(Qt::Window | Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowCloseButtonHint | Qt::MacWindowToolBarButtonHint); 
     QPushButton *b = new QPushButton(d); 
     connect(b,SIGNAL(clicked()),this,SLOT(changeDialog())); 
     b->setText("Dir Only"); 
     switch(d->exec()){ 
      default: 
      break; 
     } 
     delete(d); 
     d=NULL; 
} 

//FUNCTION:changeDialog(), called from the QFileDialog to switch the fileMode. 

void buggy::changeDialog(){ 
    if(d != NULL){ 
    QPushButton *pb = (QPushButton*)d->childAt(5,5); 
    if(pb->text().contains("Dir Only")){ 
     pb->setText("File Only"); 
     d->setFileMode(QFileDialog::Directory); 
    }else{ 
     pb->setText("Dir Only"); 
     d->setFileMode(QFileDialog::ExistingFile); 
    } 
    } 
} 
+0

감사합니다. 나는 python으로 해결책을 찾고 있었다. 하지만 그 생각은 똑같습니다. – 0xc0de

+0

내가 이것을 작성한 후에 그것을 보았습니다. 그러나 나는 C++을 사용하는 모든 사람들에게 대답을 남길 것이라고 생각했습니다. 또,이 메소드는 서브 클래스를 필요로하지 않습니다. – buster