2014-10-14 3 views
0

QFileDialog에서 파일을 선택할 때마다 accepted 신호가 발생하고 창이 닫힙니다. 여러 파일을 선택하고 "열기"를 클릭 할 때 발생하는 신호를 캡처 할 수 있도록 창을 열어 놓고 싶습니다."open"을 클릭했을 때만 QFileDialog를 닫습니다.

QFileDialog* myDialog = new QFileDialog(this); 
myDialog->setFileMode(QFileDialog::ExistingFiles); 
myDialog->setVisible(true); 

이 효과를 얻기 위해 어떤 신호를 연결해야합니까?

+0

선택 사항이 변경되면 바로 실행되는 신호는 신경 쓰지 않습니다. '열기'를 명시 적으로 클릭하면 발생하는 일만 신경 씁니다. – Kvass

+4

QStringList 파일 이름 = QFileDialog :: getOpenFileNames 사용할 수 있습니다 (이 "파일 열기"); 선택한 모든 파일 목록을 가져 오지 만 질문에 답변하지 않습니다. –

+0

사용자가 하나의 파일을 선택하고 열기를 클릭하고이 파일을 추가하고 창을 열고 사용자가 다음 파일을 선택하도록하고 싶습니다. 열기를 클릭하고 마지막으로 사용자가 닫기를 클릭하면 창이 닫힙니 까? – Chernobyl

답변

5

QFileDialog::ExistingFiles은 여러 개의 파일을 선택할 수 있어야합니다. 문서에서 직접

void QFileDialog::filesSelected(const QStringList & selected) 

: 당신이 신호에 연결할 수 있음을 감안할 때

대화 상자가 허용됩니다 지역 운영 및 에 대한 선택이 변경되면이 신호에 방출되면 (가능하면 비어 있음) 목록을 표시합니다. 이 경우 dialog 객체가 가지고있는

QStringList fileNames; 
if (dialog.exec()) 
    fileNames = dialog.selectedFiles(); 

참고 : 이러한 파일을 수집에만 관심이있는 경우

그러나, 당신은 완전히 신호 슬롯 및 쓰기 (문서에서 다시 촬영)을 방지 할 수 있습니다 스택에 생성되었습니다 (이는 그러한 객체에 대한 일반적인 접근 방식입니다).

1

코드가 괜찮습니다. Ctrl을 잡고 필요로하는 모든 파일을 한 번 클릭하는 대신 대화 상자 안의 파일을 두 번 클릭한다고 생각합니다.

선택적으로 이벤트 필터를 사용하고 두 번 클릭 이벤트를 무시할 수 있습니다.

열기를 클릭하면 QStringList에있는 모든 파일 경로 목록을 QFileDialog::selectedFiles()으로 표시 할 수 있습니다. 또한 여기에 스택 변수를 사용하고 exec 메서드를 사용하여 BaCaRoZzo에서 지적한대로 스택 변수를 시작하는 것이 좋습니다.

QFileDialog myDialog(this); 
myDialog.setFileMode(QFileDialog::ExistingFiles); 
if(myDialog.exec()) 
{ 
    qDebug() << myDialog.selectedFiles(); 
} 
0

내가 허용 신호가 발사되어 내 QFileDialog에서 파일을 선택하고 창을 닫을 때마다. 나는 그래서 여러 파일

모든 다른 답변 선택 여러 파일을 한 번하고 Open 버튼을 누른 후 CLOSE 창 바로 솔루션입니다를 선택할 수 있습니다 열려있는 창을 유지하려면. 내 솔루션을 얻을, 그것은 많은 작업이 필요하기 때문에 매우 간단하지 않다 : 내 대답에 람다 표현식과 새로운 신호와 슬롯 구문을 사용

을,하지만 당신은 오래된 구문을 사용하거나

CONFIG += c++11 

을 추가 할 수 있습니다 .pro 파일을 사용하고 lambdas를 사용하십시오.

서브 클래스 QFileDialog :

헤더 :

#ifndef CUSTOMFILEDIALOG_H 
#define CUSTOMFILEDIALOG_H 

#include <QFileDialog> 
#include <QDebug> 

class CustomFileDialog : public QFileDialog 
{ 
    Q_OBJECT 
public: 
    explicit CustomFileDialog(QWidget *parent = 0); 

    void setDefaultGeo(QRect); 

signals: 
    void newPathAvailable(QStringList list); 
public slots: 

private: 
    bool openClicked; 
    QRect geo; 

}; 

#endif // CUSTOMFILEDIALOG_H 

당신이 열기를 클릭하면, 당신이 당신의 대화를 숨기 닫을 수 없습니다!CPP :

#include "customfiledialog.h" 

CustomFileDialog::CustomFileDialog(QWidget *parent) : 
    QFileDialog(parent) 
{ 
    openClicked = false; 
    connect(this,&QFileDialog::accepted,[=]() { 
     openClicked = true; 
     qDebug() << openClicked; 
     this->setGeometry(geo); 
     this->show(); 
     emit newPathAvailable(this->selectedFiles()); 
    }); 
} 

void CustomFileDialog::setDefaultGeo(QRect rect) 
{ 
    geo = rect; 
} 

사용법 :

CustomFileDialog *dialog = new CustomFileDialog; 
QStringList fileNames; 
dialog->setFileMode(QFileDialog::ExistingFiles); 
dialog->show(); 
dialog->setDefaultGeo(dialog->geometry()); 
connect(dialog,&CustomFileDialog::newPathAvailable,[=](QStringList path) { 
    qDebug() << path; 
}); 

setDefaultGeo이 필요합니까? 이 방법을 사용하지 않으면 Open을 누른 후 창이 움직입니다.

어떤 결과가 나옵니까?

나는 FileDialog를 열고 선택 두 개의 파일을 :

enter image description here

내가 열기를 클릭하지만 창이 닫히지 않았다! 새 파일을 몇 번이고 다시 선택할 수 있습니다!

enter image description here

하나 개 이상의 파일 등 :

enter image description here

창은 경우에만 사용자를 눌러 닫기 버튼을 폐쇄되지만 사용자가 선택할 수있는 모든 경로를해야합니다.

당신이 말했듯이 :

내가 그래서 여러 파일

를 선택할 수 있습니다 열려있는 창을 유지하려면 당신이 얻을.

내가 같은 문제가 있었다 ...

0

나는 누군가가 질문을 이해했다 생각하지 않는다 (또는 그냥 내가 내 자신의 솔루션을 찾고 될 수 있습니다). 파일을 클릭하자 마자 대화 상자가 닫힙니다. 파일을 선택한 다음 대화 상자가 파일을 한 번 클릭하자마자 즉시 닫히기 때문에 파일을 선택한 다음 "열기"를 클릭 할 수 없습니다.

관련 : qtcentre.org/threads/48782-QFileDialog-single-click-only

그것 (마우스 아래에) 내 리눅스 운영 체제 설정했다 밝혀졌습니다. 파일 열기가 한 번 클릭으로 설정되었습니다. 나는 아직도 외부가 이걸 토글했을 것 같은 기분이지만 그냥 추측이다. Qt가 제대로 된 것처럼 보입니다. KDE의 kate와 같은 다른 응용 프로그램을 확인하고 동일한 동작을하는지 확인하십시오. 그것이 내 문제의 근원에 나를 안겨주 었습니다.