每当我在QFileDialog中选择一个文件时,就会触发accepted
信号并关闭窗口。我想保持窗口打开,这样我就可以选择多个文件,然后捕获"打开"点击。
QFileDialog* myDialog = new QFileDialog(this);
myDialog->setFileMode(QFileDialog::ExistingFiles);
myDialog->setVisible(true);
为了达到这个效果,我应该在这里连接什么信号?
答案 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并选择两个文件:
我点击了Open,但窗口没有关闭!您可以反复选择新文件!
还有一个文件等等:
只有当用户按下关闭按钮时,窗口才会关闭,但您将拥有用户选择的所有路径。
正如你所说:
我想保持窗口打开,以便我可以选择多个文件
你明白了。
答案 3 :(得分:0)
我认为没有人理解这个问题(或者只是我在寻找自己的解决方案)......
我有同样的问题。单击文件后,对话框将关闭。我无法选择文件,然后单击“打开”,因为单击一个文件后对话框立即关闭。
相关:qtcentre.org/threads/48782-QFileDialog-single-click-only
事实证明这是我的linux操作系统设置(在鼠标下)。文件打开设置为单击。我仍然觉得外界可能会切换这个但这只是猜测。看起来Qt是正确的。检查另一个应用程序,例如KDE上的Kate,看看它是否具有相同的行为。这就是我解决问题根源的原因。