在使用QFileDialog时,如何找出用户选择的后缀?

时间:2010-07-04 15:20:30

标签: qt qfiledialog

我正在使用以下代码获取需要存储的文件的文件名..

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

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

3 个答案:

答案 0 :(得分:2)

查看this讨论。它对QFileInfo中输入的字符串使用QFileDialog

答案 1 :(得分:1)

您需要使用第5个可选字符串
我通常这样做:

#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()问题。

答案 2 :(得分:1)

问题中的代码适用于Windows(Qt 4.6.2和Win XP)。 fileName包含选定的扩展名。但是你显然正在使用其他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];
}

这是来自here的轻微修改代码。