8

我希望用户能够输入将保存为 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);
4

3 回答 3

11

由于从对话框中获取字符串getSaveFileName,因此您可以执行以下操作:

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

它在 Linux 上可能有所不同,因为这个小片段隐藏在以下文档中getSaveFileName

在 Windows、Mac OS X 和 Symbian^3 上,此静态函数将使用本机文件对话框,而不是 QFileDialog。

换句话说,至少在 Qt 方面,添加前缀(由本机对话框完成)是异常的。


正如评论中所指出的,您可能会发现此解决方案存在一个问题,即如果您xyzzy手动输入并且文件xyzzy.xml已经存在,对话框本身不会通知您(假设本机对话框执行此操作 - 我实际上没有检查)。如果你想要这种行为,你也需要实现它。

于 2012-03-22T12:25:46.170 回答
4

我们创建了自己的保存对话框方法来解决这个问题。该解决方案与@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
}
于 2012-03-22T12:44:44.677 回答
0

你看过 QFileDialog::setDefaultSuffix 吗?

于 2013-06-27T06:08:49.613 回答