仅在单击“打开”时关闭QFileDialog

时间:2014-10-14 04:20:56

标签: c++ qt qfiledialog

每当我在QFileDialog中选择一个文件时,就会触发accepted信号并关闭窗口。我想保持窗口打开,这样我就可以选择多个文件,然后捕获"打开"点击。

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

为了达到这个效果,我应该在这里连接什么信号?

4 个答案:

答案 0 :(得分:6)

QFileDialog::ExistingFiles应该保证可以选择多个文件。鉴于此,您可以连接到信号:

void QFileDialog::filesSelected(const QStringList & selected)

直接来自文档:

  

当选择更改为本地操作并且接受对话框时,将使用所选文件的(可能为空)列表发出此信号。

但是,如果您只对收集此类文件感兴趣,则可以完全避免信号插槽和写入(从文档中再次提取):

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

请注意,在这种情况下,已在堆栈上创建dialog对象(这是此类对象的常用方法)。

答案 1 :(得分:2)

您的代码对我来说很好。我相信你双击对话框中的文件,而不是按住Ctrl并单击所需的所有文件。

您可以选择使用事件过滤器并忽略双击事件。

点击“打开”后,您可以获得QStringList给出的QFileDialog::selectedFiles()中所有文件路径的列表。此外,最好在这里使用堆栈变量,并使用exec方法按照BaCaRoZzo的指示启动它。

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

答案 2 :(得分: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

我点击了Open,但窗口没有关闭!您可以反复选择新文件!

enter image description here

还有一个文件等等:

enter image description here

只有当用户按下关闭按钮时,窗口才会关闭,但您将拥有用户选择的所有路径。

正如你所说:

  

我想保持窗口打开,以便我可以选择多个文件

你明白了。

答案 3 :(得分:0)

我认为没有人理解这个问题(或者只是我在寻找自己的解决方案)......

我有同样的问题。单击文件后,对话框将关闭。我无法选择文件,然后单击“打开”,因为单击一个文件后对话框立即关闭。

相关:qtcentre.org/threads/48782-QFileDialog-single-click-only

事实证明这是我的linux操作系统设置(在鼠标下)。文件打开设置为单击。我仍然觉得外界可能会切换这个但这只是猜测。看起来Qt是正确的。检查另一个应用程序,例如KDE上的Kate,看看它是否具有相同的行为。这就是我解决问题根源的原因。