在 QFileDialog::getSaveFileName 中指定默认扩展名

Posted

技术标签:

【中文标题】在 QFileDialog::getSaveFileName 中指定默认扩展名【英文标题】:Specify default extension in QFileDialog::getSaveFileName 【发布时间】:2011-08-29 18:41:35 【问题描述】:

在 Win32 函数 GetSaveFileName 中使用的 OPENFILENAME 结构的 lpstrDefExt 成员是否等效?

这是来自 MSDN 的描述:

LPCTSTR lpstrDefExt

默认扩展名。 GetOpenFileName 和 GetSaveFileName 附加这个 如果用户未能键入扩展名,则为文件名添加扩展名。 该字符串可以是任意长度,但只有前三个字符是 附加。该字符串不应包含句点 (.)。如果这个成员 为 NULL 且用户未能键入扩展名,则没有扩展名 附加。

因此,如果 lpstrDefExt 设置为“txt”并且用户键入“myfile”而不是“myfile.txt”,该函数仍然返回“myfile.txt”。

【问题讨论】:

【参考方案1】:

编辑:如果这对您不起作用,请查看@user52366 的the answer below

如果指定,Qt 将从“selectedFilter”参数中提取默认扩展名。

这是一个例子:

QString filter = "Worksheet Files (*.abd)";
QString filePath = QFileDialog::getSaveFileName(GetQtMainFrame(), tr("Save Worksheet"), defaultDir, filter, &filter);

使用此代码时,如果用户未在对话框中指定扩展名,getSaveFileName() 方法将自动添加“.abd”文件扩展名。您可以在“qfiledialog_win.cpp”Qt 源文件中的 qt_win_get_save_file_name() 中看到它的实现。

很遗憾,这不适用于 getOpenFileName() 方法。

【讨论】:

这对我不起作用,我无法在文档中引用此类用法。你能给我一个指针吗?【参考方案2】:

正如上面评论中提到的,这不起作用,至少对我来说是这样。

最后我跳过了静态方法并使用了以下方法:

QFileDialog dialog(this, "Save someting", QString(),
                   "Comma-separated file (*.csv)");
dialog.setDefaultSuffix(".csv");
dialog.setAcceptMode(QFileDialog::AcceptSave);
if (dialog.exec()) 
    const auto fn = dialog.selectedFiles().front();
    // a QStringList is returned but it always contains a single file
    // do something using filename 'fn' ...

【讨论】:

也许他们在新版本中改变了它【参考方案3】:

不确定 LPCTSTR lpstrDefExt 到底想做什么,但 Qt 文档给出了以下示例

 QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"),
                            "/home/jana/untitled.png",
                            tr("Images (*.png *.xpm *.jpg)"));

http://doc.qt.io/qt-5/qfiledialog.html#getSaveFileName

【讨论】:

在 Windows 中,如果您从记事本中获得“保存文件”对话框,并且您只键入“a”而不是“a.txt”,则创建的文件不会是“a”。 (即没有扩展名),它将是'a.txt'。

以上是关于在 QFileDialog::getSaveFileName 中指定默认扩展名的主要内容,如果未能解决你的问题,请参考以下文章

秋的潇洒在啥?在啥在啥?

上传的数据在云端的怎么查看,保存在啥位置?

在 React 应用程序中在哪里转换数据 - 在 Express 中还是在前端使用 React?

存储在 plist 中的数据在模拟器中有效,但在设备中无效

如何在保存在 Mongoose (ExpressJS) 之前在模型中格式化数据

如何在保存在 Mongoose (ExpressJS) 之前在模型中格式化数据