有没有办法在Linux上使用QFileDialog自动添加扩展名到文件

Rob*_*ley 8 c++ qt qfiledialog

我希望用户能够输入将保存为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);
Run Code Online (Sandbox Code Playgroud)

pax*_*blo 11

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

if (!groupingFile.endsWith(".xml"))
    groupingFile += ".xml";
Run Code Online (Sandbox Code Playgroud)

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

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

换句话说,至少就Qt而言,添加前缀(由本机对话框完成)是异常的.


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

  • 这种方法有一个缺点:如果您使用`QFileDialog::confirmOverwrite`(默认),QFileDialog 会测试与您实际写入的文件名不同的文件名。解决方案是通过`QFileDialog::DontConfirmOverwrite` 并执行您自己的确认对话框,或者使用`QFileDialog::defaultSuffix`,它不能通过`QFileDialog::getSaveFileName` 获得。无论哪种方式,您都需要比静态函数调用更多的代码。:-( (2认同)