Qt QFileDialog:获取文件名

Qt QFileDialog:获取文件名,qt,qfiledialog,Qt,Qfiledialog,我正在使用Qt5和QFileDialog。我想限制用户在文件名中给出正斜杠(/) QFileDialog saveAsdialog(this); QString filename = saveAsdialog.getSaveFileName(this, tr("Save file"), ".", tr("Files (*.csv)")); 我有下面的QFileDialog代码来保存文件名 QFileDialog saveAsdialog(this); QString filename = sa

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

QFileDialog saveAsdialog(this);
QString filename = saveAsdialog.getSaveFileName(this, tr("Save
file"), ".", tr("Files (*.csv)"));
我有下面的QFileDialog代码来保存文件名

QFileDialog saveAsdialog(this);
QString filename = saveAsdialog.getSaveFileName(this, tr("Save
file"), ".", tr("Files (*.csv)"));
在对话框中,若用户在“下载”文件夹中给出文件名“abc.csv”,则“getSaveFileName”返回“/home/user/Downloads/abc.csv”,这是正确的

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

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

QFileDialog saveAsdialog(this);
QString filename = saveAsdialog.getSaveFileName(this, tr("Save
file"), ".", tr("Files (*.csv)"));
当用户单击“确定”时,如何获得正确的文件名“abc/xyz.csv”?

请注意这一点

如您所见,
/
字符在文件名中被禁止。因此,文件名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, "");
}
请注意这个

如您所见,
/
字符在文件名中被禁止。因此,文件名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, "");
}

您能详细说明一下在这种情况下您得到了什么,以及您的期望是什么吗?我的期望是当用户在对话框中将文件名设置为“abc/xyz.csv”时,我希望在用户按下“确定”按钮并关闭对话框时提取文件名。我得到了完整的路径,比如“/home/user/Downloads/abc/xyz.csv”。从该路径中,我无法找到用户给定的文件名。一旦用户关闭对话框,我们应该如何获得用户在对话框中给出的确切文件名?@Neel至少你可以派生
QFileDialog
并通过必要的检查重新实现
accept
方法。你能详细说明在这种情况下你得到了什么,你的期望是什么吗?我的期望是当用户给出文件名时“abc/xyz.csv”在对话框中,我想在用户按下“确定”按钮并关闭对话框时提取文件名。我得到的是完整路径,如“/home/user/Downloads/abc/xyz.csv”“。在此路径中,我无法找到用户给定的文件名。一旦用户关闭对话框,我们应该如何获得用户在对话框中给出的确切文件名?@Neel至少可以派生
QFileDialog
并通过必要的检查重新实现
accept
方法。在不同的对话框中,用户可以在文件名中键入
/
。本机Windows对话框根本不允许使用它。Qt对话框允许它,并将
abc/xyz.csv
视为当前目录的
abc
子目录中的文件
xyz.csv
。但它不检查
abc
是否存在。附言:不确定这是一个大问题;如果无法打开文件,只需显示一个错误。你是对的。仅供参考-错误打开文件仅在linux中出现,但在Mac OS中,文件名中的“/”将转换为“:”。在Mac文件名中,abc/xyz.csv将由Qt abc:xyz.csv连接。这可能是一个解决办法,但当用户关闭对话框时,有没有办法只从对话框中提取文件名?e、 g.如果用户给出文件名“abc/xyz.csv”并保存在文件夹“/home/user/Downloads”中,那么我得到的是“/home/user/Downloads/abc/xyz.csv”这样的完整路径,在用户关闭对话框后,我无法从中找到用户在对话框中给出的确切文件名。@Evgeny。谢谢你的评论。我已经试过你的补丁,但是我想要保存文件而不是打开文件的对话框。在“保存文件”对话框中,用户将输入文件名。我尝试过你的解决方案,但它要求从现有文件夹中打开文件。谢谢Evgeny。。我得到了你评论的答案。我必须将“AcceptMode”设置为“另存为”对话框。再次感谢您的回复。在不同的对话框中,用户可以在文件名中键入
/
。本机Windows对话框根本不允许使用它。Qt对话框允许它,并将
abc/xyz.csv
视为当前目录的
abc
子目录中的文件
xyz.csv
。但它不检查
abc
是否存在。附言:不确定这是一个大问题;如果无法打开文件,只需显示一个错误。你是对的。仅供参考-错误打开文件仅在linux中出现,但在Mac OS中,文件名中的“/”将转换为“:”。在Mac文件名中,abc/xyz.csv将由Qt abc:xyz.csv连接。这可能是一个解决办法,但当用户关闭对话框时,有没有办法只从对话框中提取文件名?e、 g.如果用户给出文件名“abc/xyz.csv”并保存在文件夹“/home/user/Downloads”中,那么我得到的是“/home/user/Downloads/abc/xyz.csv”这样的完整路径,在用户关闭对话框后,我无法从中找到用户在对话框中给出的确切文件名。@Evgeny。谢谢你的评论。我已经试过你的补丁,但是我想要保存文件而不是打开文件的对话框。在“保存文件”对话框中,用户将输入文件名。我尝试过你的解决方案,但它要求从现有文件夹中打开文件。谢谢Evgeny。。我得到了你评论的答案。我必须将“AcceptMode”设置为“另存为”对话框。再次感谢您的回复。