Есть ли способ автоматически добавлять расширения в файл, используя QFileDialog в Linux - PullRequest
8 голосов
/ 22 марта 2012

Я хочу, чтобы пользователь мог ввести имя для файла, который будет сохранен в виде XML-файла.В настоящее время на Windows и Mac, если вы введете «test» в качестве имени файла, он автоматически добавит «.xml», что я и хочу.К сожалению, при тестировании сборки Linux я обнаружил, что ввод имени файла без расширения сохранит его как обычный файл.Пользователь должен указать расширение в строке файла (например, «test.xml»), чтобы сохранить его в правильном формате.

Код, который я использую, приведен ниже.Это ошибка Qt или есть способ указать в Qt, что оно должно добавить расширение, если оно не было найдено?

// Get value for "dir". If the setting doesn't exist then use
// the the path in "defaultsave.directory"
QString prevPath = prevValues.value("dir", QString::fromStdString(
  ConfigService::Instance().getString("defaultsave.directory"))).toString();

QString filter;
filter.append("Files (*.xml)");
filter += ";;AllFiles (*.*)";
QString groupingFile = QFileDialog::getSaveFileName(this, "Save Grouping file as", prevPath, filter);

Ответы [ 3 ]

10 голосов
/ 22 марта 2012

Поскольку вы получаете строку из диалога с getSaveFileName, вы можете просто сделать что-то вроде:

if (!groupingFile.endsWith(".xml"))
    groupingFile += ".xml";

Возможно, в Linux все по-другому из-за этого небольшого фрагмента, скрытого в документации для getSaveFileName:

В Windows, Mac OS X и Symbian ^ 3 эта статическая функция будет использовать собственное диалоговое окно файла, а не QFileDialog.

Другими словами, это добавление префикса (сделанного родными диалогами), который является аберрантным, по крайней мере, с точки зрения Qt.


Как указано в комментариях, вы можете столкнуться с проблемой этого решения в том, что само диалоговое окно не будет уведомлять вас, если вы введете xyzzy вручную, а файл xyzzy.xml уже существует (при условии, что собственные диалоговые окна сделать это - я на самом деле не проверил). Если вам нужно такое поведение, вам также необходимо его реализовать.

4 голосов
/ 22 марта 2012

Мы создали наш собственный метод сохранения диалога, чтобы обойти это. Решение по сути такое же, как и у ответа @ paxdiablo (просто добавьте расширение), но это более общее:

QString ShowSaveFileDialog(QWidget *parent,
                           const QString &title,
                           const QString &directory,
                           const QString &filter) {
#if defined(Q_WS_WIN) || defined(Q_WS_MAC)
  return QFileDialog::getSaveFileName(parent,
                                      title,
                                      directory,
                                      filter);
#else
  QFileDialog dialog(parent, title, directory, filter);
  if (parent) {
    dialog.setWindowModality(Qt::WindowModal);
  }
  QRegExp filter_regex(QLatin1String("(?:^\\*\\.(?!.*\\()|\\(\\*\\.)(\\w+)"));
  QStringList filters = filter.split(QLatin1String(";;"));
  if (!filters.isEmpty()) {
    dialog.setNameFilter(filters.first());
    if (filter_regex.indexIn(filters.first()) != -1) {
      dialog.setDefaultSuffix(filter_regex.cap(1));
    }
  }
  dialog.setAcceptMode(QFileDialog::AcceptSave);
  if (dialog.exec() == QDialog::Accepted) {
    QString file_name = dialog.selectedFiles().first();
    QFileInfo info(file_name);
    if (info.suffix().isEmpty() && !dialog.selectedNameFilter().isEmpty()) {
      if (filter_regex.indexIn(dialog.selectedNameFilter()) != -1) {
        QString extension = filter_regex.cap(1);
        file_name += QLatin1String(".") + extension;
      }
    }
    return file_name;
  } else {
    return QString();
  }
#endif  // Q_WS_MAC || Q_WS_WIN
}
1 голос
/ 27 июня 2013

Вы смотрели на QFileDialog :: setDefaultSuffix?

...