Есть ли способ автоматически добавлять расширения в файл с помощью QFileDialog в Linux

Я хочу, чтобы пользователь мог ввести имя файла, который будет сохранен как XML-файл. В настоящее время на Windows и Mac, Если вы введете "тест" в качестве имени файла, он автоматически добавит ".xml", что я и хочу. К сожалению, при тестировании сборки Linux я обнаружил, что ввод имени файла без расширения будет сохранен как обычный файл. Пользователь должен указать расширение в строке файла (i.e " тест.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 ответов


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

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

вероятно, это отличается от Linux из-за этого маленького фрагмента, похороненного в документации для getSaveFileName:

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

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


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


мы создали собственный метод диалога сохранения, чтобы обойти это. Решение по существу такое же, как и ответ @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
}

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