首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >有没有一种方法可以在Linux上使用QFileDialog自动向文件添加扩展名?

有没有一种方法可以在Linux上使用QFileDialog自动向文件添加扩展名?
EN

Stack Overflow用户
提问于 2012-03-22 12:21:14
回答 3查看 6.5K关注 0票数 8

我希望用户能够输入一个文件的名称,将被保存为xml文件。目前在Windows和Mac上,如果你输入"test“作为文件名,它会自动添加".xml”,这就是我想要的。不幸的是,在测试Linux构建时,我发现输入一个不带扩展名的文件名将保存为一个普通文件。用户必须在文件字符串中指定扩展名(即"test.xml"),以便以正确的格式保存。

我使用的代码如下所示。这是一个Qt bug吗?或者有没有办法在Qt中指定如果找不到扩展就应该添加一个扩展?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 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);
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-22 12:25:46

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if (!groupingFile.endsWith(".xml"))
    groupingFile += ".xml";

在Linux上可能会有所不同,因为getSaveFileName文档中隐藏了这个小片段。

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

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

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

票数 11
EN

Stack Overflow用户

发布于 2012-03-22 12:44:45

我们创建了自己的保存对话框方法来解决这个问题。解决方案基本上与@paxdiablo的答案相同(只需添加扩展名),但这更通用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
}
票数 4
EN

Stack Overflow用户

发布于 2013-06-27 06:08:50

你看过QFileDialog::setDefaultSuffix吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9822177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文