我正在使用以下代码获取需要存储的文件的文件名..
QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"),"/home/user/MyDocs/",tr("JPG files (*.jpg);;BMP files (*.bmp);;PNG files (*.png)"));
我正在为用户提供有关要保存文件的文件格式的许多选项。但是,返回的QString
只给出了用户选择的前缀文件名,而不是后缀,因此我不知道用户选择了哪种文件格式。如何检测这种文件格式?
答案 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的轻微修改代码。