在 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?