Как узнать, какой суффикс пользователь выбрал при использовании QFileDialog? - PullRequest
6 голосов
/ 04 июля 2010

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

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

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

Ответы [ 3 ]

2 голосов
/ 04 июля 2010

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

1 голос
/ 04 июля 2010

Код в вопросе работает в 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 голос
/ 04 июля 2010

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

Компилятор заботится о конкатенации буквенных строк в аргументе.

IЯ не уверен, как возвращаемая строка взаимодействует с tr().Вам придется проверить и выяснить.вероятно, нужно его перевести.
Возможно, было бы лучше, если бы функция возвращала индекс выбранного фильтра, но, увы, нет.

Лучше было бы поместить фильтры всписок, создать из него строку, а затем сравнить с возвращенной выбранной строкой фильтра с теми, что в списке.Это также решило бы проблему tr().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...