如何在QFileDialog :: getExistingDirectory中指定文件过滤器?

时间:2016-02-13 21:19:35

标签: qt qt-creator qfiledialog

我需要在"中选择包含文件" *。的目录。 但是,如果我使用getExistingDirectory,我无法指定文件过滤器,因此我无法查看文件。

但我需要只看" *。"文件,我只能选择目录,而不是文件。 现在我使用这段代码:

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

我无法在所选目录中看到任何文件(在对话框中)。

我怎么能这样做?

2 个答案:

答案 0 :(得分:2)

您需要传递QFileDialog::DontUseNativeDialog选项。来自getExistingDirectory的{​​{3}}:

  

在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将阻止对话框关闭)。

答案 1 :(得分:0)

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

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