Хорошо я использую следующий код для получения имени файла для файла, который должен храниться..
QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"),"/home/user/MyDocs/",tr("JPG files (*.jpg);;BMP files (*.bmp);;PNG files (*.png)"));
Я предоставляю пользователю много опций относительно формата файла, в котором должен быть сохранен файл. Однако возвращенный QString
только дает мне имя файла префикса, которое пользователь выбрал, не суффикс, и таким образом я не знаю, какой формат файла пользователь выбрал. Как я могу обнаружить такой формат файла?
Посмотрите это обсуждение. Он использует QFileInfo
на строке, которая была введена в QFileDialog
.
Код, указанный в вопросе, работает в 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];
}
Это немного измененный код из здесь .
Вам нужно использовать 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()
.