QFileDialog : 获取文件名

Posted

技术标签:

【中文标题】QFileDialog : 获取文件名【英文标题】:QFileDialog : get file name 【发布时间】:2016-07-04 15:25:27 【问题描述】:

我正在使用 Qt 5 和 QFileDialog。我想限制用户在文件名中使用正斜杠 (/)。

我有下面的 QFileDialog 代码来保存文件名。

QFileDialog saveAsdialog(this);
QString filename = saveAsdialog.getSaveFileName(this, tr("Save
file"), ".", tr("Files (*.csv)"));

在对话框中,如果用户在“下载”文件夹中提供文件名“abc.csv”,则“getSaveFileName”返回“/home/user/Downloads/abc.csv”,这是正确的。

但我的问题是,当用户在文件名 (/) 中给出正斜杠时,它的行为不正确。

例如如果用户想给文件名“abc/xyz.csv”,那么我没有得到正确的文件名。

当用户点击“确定”时,如何获取正确的文件名“abc/xyz.csv”?

【问题讨论】:

您能否详细说明在这种情况下您会得到什么,您的期望是什么? 我的期望是当用户在对话框中将文件名指定为“abc/xyz.csv”时,我想在用户按下确定按钮并关闭对话框时提取文件名。我得到像“/home/user/Downloads/abc/xyz.csv”这样的完整路径。从这个路径我无法找到用户给出的文件名。一旦用户关闭对话框,我们应该如何获得用户在对话框中给出的确切文件名? @Neel 至少你可以派生出QFileDialog 并通过需要的检查重新实现accept 方法。 【参考方案1】:

请关注这个wikipedia link。

如您所见,文件名中禁止使用/ 字符。所以文件名abc/xyz.csv不正确。

您还可以随时在文件对话框中检查当前目录,并根据此信息跟踪选定的文件名。试试这个:

QFileDialog saveAsdialog(this);
QString curDir(QDir('.').absolutePath());
connect(&saveAsdialog, &QFileDialog::directoryEntered, [&curDir](const QString& dir) 
    curDir = dir;
);
// We cann't use static member getSaveFileName
//QString filename = saveAsdialog.getSaveFileName(this, tr("Save file"), ".", tr("Files (*.csv)"));
//here manual saveAsdialog setup
...........
if (saveAsdialog.exec() == QDialog::Accepted) 

    QString filename = saveAsdialog.selectedFiles().first(); //add check that list is not empty!!!
    QString f = filename.replace(curDir, "");

【讨论】:

在不同的对话框中,用户可能会或不会在文件名中输入/。本机 Windows 对话框根本不允许。 Qt 对话框允许它并将abc/xyz.csv 视为当前目录的abc 子目录中的文件xyz.csv。但它不会检查abc 的存在。 P.S.:不确定是不是大问题;如果您无法打开文件,则仅显示错误。 你是对的。仅供参考 - 错误打开文件只会出现在 linux 中,但在 Mac OS 中,“/”将转换为文件名中的“:”。在 Mac 文件名 abc/xyz.csv 将由 Qt abc:xyz.csv 转换。这可能是一种解决方法,但是当用户关闭对话框时,有没有办法仅从对话框中提取文件名?例如如果用户提供文件名“abc/xyz.csv”并保存在文件夹“/home/user/Downloads”中,那么我将获得像“/home/user/Downloads/abc/xyz.csv”这样的完整路径,我就是这样用户关闭对话框后,无法找到用户在对话框中给出的确切文件名。 @Evgeny。感谢 cmets。我已经尝试过你的补丁,但我想要保存文件的对话框而不是打开文件。在保存文件对话框中,用户将输入文件的名称。我已经尝试过您的解决方案,但它要求从现有文件夹中打开文件。 谢谢 Evgeny.. 我得到了你的 cmets 的答案。我必须设置“AcceptMode”才能保存为对话框。再次感谢您的回复。

以上是关于QFileDialog : 获取文件名的主要内容,如果未能解决你的问题,请参考以下文章

Python:如何获取 PyQt5 中选定文件的文件大小?

4.4 标准文件对话框

QT QFileDialog::getSaveFileName如何把文件默认保存路径设为桌面;

在QT中怎样获取中文的文件名?

Pyqt5 QFileDialog 在我的获取目录程序中不起作用

QT 教程 之 基础Dialog