7

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

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

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

4

3 回答 3

2

看看这个讨论。它用于QFileInfoQFileDialog.

于 2010-07-04T15:31:09.003 回答
2

您需要使用第 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()问题。

于 2010-07-04T15:32:11.793 回答
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];
}

这是从这里稍微修改的代码。

于 2010-07-04T16:28:27.493 回答