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

7
在Win32函数GetSaveFileName中,是否有类似于OPENFILENAME结构的lpstrDefExt成员的等效项?
以下是MSDN网站上的描述:
LPCTSTR lpstrDefExt
默认扩展名。如果用户没有输入扩展名,则GetOpenFileName和GetSaveFileName会将此扩展名附加到文件名。该字符串的长度可以是任意的,但只有前三个字符会被附加。字符串不应包含句点(.)。如果此成员为NULL并且用户未输入扩展名,则不会附加任何扩展名。
因此,如果将lpstrDefExt设置为“txt”,而用户却输入了“myfile”而不是“myfile.txt”,函数仍然会返回“myfile.txt”。
3个回答

4

编辑:如果这个方法对你不起作用,请看下面 用户52366的回答

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

以下是一个示例:

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()方法,此功能不起作用。

8
这对我没用,而且在文档中找不到这样使用的参考。你能给我提供指引吗? - Samuel Li
1
这对我也不起作用,使用Qt5.12。 - Leogout
在我的Linux/Flatpak上使用Qt 5.15.8和PyQt 5.15.4无法运行,可能与沙盒或其他问题有关,错误报告:https://github.com/ozmartian/vidcutter/issues/375 - Thomas Perl

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' ...
}

也许在更新的版本中已经改变了。 - sashoalm

0

不确定 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


1
在Windows中,如果你从记事本等应用程序中得到一个保存文件对话框,而你只输入了“a”而不是“a.txt”,那么创建的文件将不会是“a.”(即没有扩展名),而是“a.txt”。 - sashoalm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接