使用 QFileDialog 选择文件夹中的文件

Selecting files with folder using QFileDialog

我在使用 C++ 和 Qt 的应用程序中有一个用例(windows 10)。该应用程序使用 7zip.exe 作为子进程来解压缩 selected 文件夹中的文件。我需要使用 QFileDialog 来 select 一个文件夹,并获取所有扩展名为 .zip 和 .7z 的文件,自动 selected 然后使用 QProcess 解压缩它们并将它们显示在输出中。 我想出了这个代码片段。对于 select 使用 selected 文件夹的文件。

void MainWindow::on_browseButton_clicked()
{
      QFileDialog d(this);
      d.setFileMode(QFileDialog::Directory);
      d.setNameFilter("*.zip");
      if (d.exec())
        qDebug () << d.selectedFiles();
}

但此代码不会 运行,并且它只显示文件夹名称而不是没有文件 selected。谁能告诉我哪里做错了。

it displays just the folder name not with no files selected.

这就是它应该做的 return。你要求它显示一个对话框 select 一个文件夹,所以这就是你所能做的 select。根据文档,selectedFiles() return selected 文件夹的路径:

https://doc.qt.io/qt-5/qfiledialog.html#FileMode-enum

Constant Value Description
QFileDialog::Directory 2 The name of a directory. Both files and directories are displayed. However, the native Windows file dialog does not support displaying files in the directory chooser.

https://doc.qt.io/qt-5/qfiledialog.html#selectedFiles

Returns a list of strings containing the absolute paths of the selected files in the dialog. If no files are selected, or the mode is not ExistingFiles or ExistingFile, selectedFiles() contains the current path in the viewport.

对话框关闭并且 exec() 已 return 编辑之后,您将需要自己迭代该文件夹以发现 .zip和其中的 .7z 个文件。

处​​理该对话框的更简单方法是使用 QFileDialog::getExistingDirectory() instead. You can construct a QDir from the selected folder, and then use the QDir::entryList() 方法在文件夹中搜索 zip 文件。

参见 How to read all files from a selected directory and use them one by one?

例如:

void MainWindow::on_browseButton_clicked()
{
    QDir directory = QFileDialog::getExistingDirectory(this);
    QStringList zipFiles = directory.entryList(QStringList() << "*.zip" << "*.7z", QDir::Files);
    foreach(QString filename, zipFiles) {
        // do whatever you need to do
    }
}