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

How specify file filter in QFileDialog::getExistingDirectory?

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

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

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

而且我在所选目录中看不到任何文件(在对话框中)。

我该怎么做?

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

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

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

On Windows and OS X, this static function will use the native file dialog and not a QFileDialog. However, the native Windows file dialog does not support displaying files in the directory chooser. You need to pass DontUseNativeDialog to display files using a QFileDialog. On Windows CE, if the device has no native file dialog, a QFileDialog will be used.

要按扩展名过滤显示的文件,您需要做更多的工作:

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 派生您自己的 class 并覆盖 accept 函数(不从您的覆盖调用 QFileDialog::accept 将阻止对话框关闭)。