Как я узнаю, какой суффиксный пользователь выбрал при использовании QFileDialog?

Хорошо я использую следующий код для получения имени файла для файла, который должен храниться..

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

Я предоставляю пользователю много опций относительно формата файла, в котором должен быть сохранен файл. Однако возвращенный QString только дает мне имя файла префикса, которое пользователь выбрал, не суффикс, и таким образом я не знаю, какой формат файла пользователь выбрал. Как я могу обнаружить такой формат файла?

6
задан BaCaRoZzo 5 November 2015 в 12:42
поделиться

3 ответа

Посмотрите это обсуждение. Он использует QFileInfo на строке, которая была введена в QFileDialog.

2
ответ дан 17 December 2019 в 07:00
поделиться

Код, указанный в вопросе, работает в 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];
}

Это немного измененный код из здесь .

1
ответ дан 17 December 2019 в 07:00
поделиться

Вам нужно использовать 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().

1
ответ дан 17 December 2019 в 07:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: