2014-10-14 3 views
0

Когда я выбираю файл в моем QFileDialog, загорается сигнал accepted, и окно закрывается. Я хочу, чтобы окно было открыто, поэтому я могу выбрать несколько файлов, а затем захватить сигнал, когда нажата кнопка «открыть».Закрыть QFileDialog только при нажатии «open»

Какие сигналы следует подключать сюда для достижения этого эффекта?

+0

Обратите внимание, что меня не волнует сигнал, который срабатывает, как только изменяется выбор. Меня беспокоит только то, что происходит при явном нажатии 'open'. – Kvass

+4

Вы можете использовать QStringList filenames = QFileDialog :: getOpenFileNames (это, «Открыть файл»); чтобы получить список со всеми выбранными файлами, но он не отвечает на ваш вопрос. –

+0

Вы хотите, чтобы этот пользователь мог выбрать один файл, открыть его, добавить этот файл, Окно по-прежнему открыто, а пользователь выбрать следующий файл, щелкнуть по кнопке «Открыть» и т. Д., И, наконец, когда пользователь нажимает кнопку «Закрыть», окно закрывается? – Chernobyl

ответ

5

QFileDialog::ExistingFiles должен гарантировать, что можно выбрать несколько файлов. Учитывая, что вы можете подключиться к сигналу:

void QFileDialog::filesSelected(const QStringList & selected) 

Непосредственно из документации:

При изменении выбора для локальных операций и диалог принят, этот сигнал излучается с (возможно пустой) список выбранных файлов.

Однако, если вы заинтересованы только в сборе таких файлов, вы можете полностью избежать сигнал-слот и запись (взято с документацией):

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

Обратите внимание, что в этом случае dialog объект имеет были созданы в стеке (что является общим подходом для таких объектов).

1

Ваш код выглядит хорошо для меня. Я считаю, что вы дважды щелкаете по файлу внутри диалогового окна, а не держите на Ctrl и единичным кликом по всем файлам, которые вам нужны.

Вы можете дополнительно использовать фильтр событий и игнорировать событие двойного щелчка.

Как только вы нажмете «Открыть», вы можете получить список всех путей к файлу в QStringList, заданный QFileDialog::selectedFiles(). Также лучше использовать переменную стека здесь и использовать метод exec, чтобы запустить его, как указано BaCaRoZzo.

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

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

Все остальные ответы просто решение для выбора многих файлов одновременно и CLOSE окно после нажатия кнопки Open. Получите мое решение, это не очень просто, потому что он требует много работы:

я использовал LAMDA выражение и новые сигналы и синтаксис слотов в моем ответе, но вы можете использовать старый синтаксис или добавить

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

Оказывается, это мои настройки ОС Linux (под мышкой). Для открытия файла было установлено однократное нажатие. Я все еще чувствую, что что-то внешнее могло бы переключить это, но это всего лишь предположение. Кажется, Qt идет правильно. Проверьте другое приложение, например, kate на KDE и посмотрите, имеет ли он такое же поведение. Именно это и привлекло меня к источнику моей проблемы.

Смежные вопросы