2016-02-13 217 views
2

我需要选择一个包含文件“* .in”的目录。 但是,如果我使用getExistingDirectory,我无法指定文件过滤器,所以我看不到文件。如何在QFileDialog :: getExistingDirectory中指定文件过滤器?

但我只需要看到“* .in”文件,我可以只选择一个目录,而不是文件。 现在我用这个代码:

qDebug() << QFileDialog::getExistingDirectory(this, tr("Выберите папку с файлами устройств"), "", QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); 

,我无法看到选择目录中的所有文件(对话)。

我该怎么做?

+1

改为使用getOpenFileName。 – 2016-02-13 21:52:21

回答

2

您需要通过QFileDialog::DontUseNativeDialog选项。从getExistingDirectorydocumentation

在Windows和OS X,这个静态函数将使用本地文件 对话框而不是QFileDialog。但是,本机Windows文件对话框 不支持在目录选择器中显示文件。您需要 传递DontUseNativeDialog以使用QFileDialog显示文件。在Windows CE的 上,如果设备没有本机文件对话框,将使用QFileDialog 。

过滤显示通过扩展名的文件,你将不得不做稍微:

QFileDialog dlg(nullptr, tr("Choose Directory")); 
dlg.setOptions(QFileDialog::DontUseNativeDialog | QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); 
dlg.setFileMode(QFileDialog::Directory); 
dlg.setNameFilter(tr("Directories with device files (*.in)")); 
if (dlg.exec()) 
    qDebug() << dlg.selectedFiles(); 

当我尝试这样做,仍显示不符合过滤条件的文件,但在灰色(我试着在MacOS上,也许你会在Windows上有更多的运气)。

没有标准的方法来阻止用户选择不包含与过滤器匹配的文件的文件夹。一种解决方案是从QFileDialog派生自己的类并覆盖accept函数(不会从覆盖中调用QFileDialog::accept将阻止对话框关闭)。

0

我认为它不适用于get-dir方法。让用户选择任何* .in文件,然后使用QFileInfo::path获取该文件的目录也是可以接受的吗?

QString inFile = QFileDialog::getOpenFileName(
    this, 
    tr("Выберите папку с файлами устройств " 
     "выделив какой-либо из файлов устройств :-)" 
    ), 
    lastSelectedDir, 
    "*.in" 
); 
QString dirName = QFileInfo(inFile).absolutePath(); 
相关问题