Qt 在使用QFileDialog时,如何找出用户选择了哪个后缀?

Qt 在使用QFileDialog时,如何找出用户选择了哪个后缀?,qt,qfiledialog,Qt,Qfiledialog,我使用下面的代码来获取需要存储的文件的文件名 QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"),"/home/user/MyDocs/",tr("JPG files (*.jpg);;BMP files (*.bmp);;PNG files (*.png)")); 我为用户提供了许多关于文件保存格式的选项。但是,返回的QString只给出了用户选择的前缀文件名,而不是后缀,因此我不知道用户选择了哪种文件格

我使用下面的代码来获取需要存储的文件的文件名

QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"),"/home/user/MyDocs/",tr("JPG files (*.jpg);;BMP files (*.bmp);;PNG files (*.png)"));

我为用户提供了许多关于文件保存格式的选项。但是,返回的
QString
只给出了用户选择的前缀文件名,而不是后缀,因此我不知道用户选择了哪种文件格式。如何检测这种文件格式?

请查看讨论。它对在
QFileDialog
中输入的字符串使用
QFileInfo
,您需要使用第五个可选字符串
我通常是这样做的:

#define JPEG_FILES "JPG files (*.jpg)"
#define BMP_FILES "BMP files (*.bmp)"
#define PNG_FILES "PNG files (*.png)"

QString selectedFilter;
QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"),
        "/home/user/MyDocs/",
        JPEG_FILES ";;" BMP_FILES ";;" PNG_FILES, &selectedFilter);

if (fileName.isNull())
  return;
if (selectedFilter == JPEG_FILES) {
  ...
} else if (selectedFilter == BMP_FILES) { 
  ...
} else if (selectedFilter == PNG_FILES) {
  ...
} else {  
    // something strange happened 
}
编译器负责连接参数中的文字字符串

我不确定返回的字符串如何与
tr()
交互。你必须测试并找出答案。可能需要取消翻译。
如果函数返回所选过滤器的索引可能会更好,但遗憾的是,它没有


更好的解决方案是将过滤器放入列表中,从中创建一个字符串,然后将返回的选定过滤器字符串与列表中的过滤器字符串进行比较。这也将解决
tr()
问题。

问题中的代码在Windows(Qt 4.6.2和Win XP)中工作。文件名包含所选的扩展名。但您显然正在使用其他Windows,因此您可以尝试以下解决方法:

QFileDialog dialog(this, tr("Save as ..."), "/home/user/MyDocs/");
dialog.setAcceptMode(QFileDialog::AcceptSave);
QStringList filters;
filters << "JPG files (*.jpg)" << "BMP files (*.bmp)" << "PNG files (*.png)";
dialog.setNameFilters(filters);
if (dialog.exec() == QDialog::Accepted)
{
    QString selectedFilter = dialog.selectedNameFilter();
    QString fileName = dialog.selectedFiles()[0];
}
QFileDialog对话框(this,tr(“另存为…”),“/home/user/MyDocs/”;
setAcceptMode(QFileDialog::AcceptSave);
QStringList滤波器;

我刚试过这个,但它对我不起作用。。返回的selectedString为空。@Ahmad:您说“返回selectedString”您是在测试示例中的
selectedFilter
还是
filename
?这是我使用的代码:QString sf;QString fileName=QFileDialog::getSaveFileName(this,tr(“保存文件”),“/home/user/MyDocs/”,tr(“JPG文件(.JPG);;BMP文件(.BMP);;PNG文件(*.PNG)”,&sf);执行上述两行后,sf不包含任何内容。。只有当您按“确定”而不是取消对话框时,..sf才会有内容。当我阅读这些文档()时,selectedFilter似乎用于设置对话框出现时显示的默认过滤器。它可能被设置为用户从函数返回时选择的过滤器,但文档没有明确说明它将被设置为过滤器。一旦我得到需要的答案,我肯定会在这里接受答案。。呃,这不太管用。。QFileInfo仅在传入的字符串(即链接到的示例中的“s”)包含已具有后缀的文件名时才起作用。。例如,如果字符串为“file.ext”,则后缀将返回“ext”。。我的问题是文件名首先没有后缀。。也就是说,我得到的文件名是“/home/user/MyDocs/fileName”。。。没有后缀..这与OPs代码不同。它将打开QTs文件对话框,而不是平台文件对话框。感谢您提供此示例。这是我问题的答案。。。但我还有一个小问题要问。对话框.selectedNameFilter()将返回“something(*.ext)”,是否有方法只获取.ext?所以我可以添加到文件中,如果用户没有?