QFileDialog:保存文件时自动添加扩展名?

15

使用QFileDialog保存文件并指定扩展名(例如*.pdf),如果用户输入的名称没有这个扩展名,那么保存的文件也不会有这个扩展名。
示例代码:

QFileDialog fileDialog(this, "Choose file to save");
fileDialog.setNameFilter("PDF-Files (*.pdf)");
fileDialog.exec();
QFile pdfFile(fileDialog.selectedFiles().first());

现在当用户输入名称为"foo"时,文件将被保存为"foo"而不是"foo.pdf"。因此,QFileDialog不会自动添加扩展名。我的问题是:我该如何更改这个呢?


1
Qt的文档清晰而全面,我想知道你怎么可能会错过QFileDialog :: setDefaultSuffix()。 - Julien-L
1
看起来要做与QFileDialog :: getSaveFileName()相同的工作,需要做很多工作。我错过了什么吗? - Andy M
5
@Julien L.:我通常尝试回答问题,而不是质疑需求,特别是对于像这样简单的查询。但是,如果 OP 打开我链接的页面并搜索 "extension",他会发现只有 "setNameFilter" 的示例,以及与默认后缀无关的其他内容。 - Caleb Huitt - cjhuitt
1
@cjhuitt:确切地说,这就是我问这个(容易回答)问题的原因。 - Berschi
2个回答

20
您可以使用QFileDialog::setDefaultSuffix()方法:

此属性为文件名添加后缀(如果未指定其他后缀)。

此属性指定一个字符串,如果文件名没有后缀,则会将其添加到文件名中。后缀通常用于指示文件类型(例如,“txt”表示文本文件)。


8
如果有多个文件类型允许上传,比如“所有文件 (*.pdf .txt);;PDF 文件 (.pdf)”,而用户选择了第二个选项 PDF 文件,那么应该如何实现呢? - manatttta
2
@manatttta 虽然不是非常简单,但您可以通过创建 QFileDialog 的子类,在其中连接 filterSelected() 信号到一个槽函数上,该槽函数会搜索过滤器字符串以找到第一个文件扩展名,并使用 setDefaultSuffix() 函数设置它。 - Parker Coates

1

对于多个文件过滤器,可以执行以下操作。

import re
import os

def saveFile(self):
    path, fileFilter = QFileDialog().getSaveFileName(self, "Save file", 
        "", "Gnuplot Files (*.plt)" 
        + ";;" + "Gnuplot Files (*.gp)"
        + ";;" + "Gnuplot Files (*.gpt)"
        + ";;" + "Text Files (*.txt)")

    selectedExt = re.search('\((.+?)\)',fileFilter).group(1).replace('*','')

    # Attach extension as per selected filter, 
    # if file does not have extension.
    if not os.path.splitext(path)[1]:
        path = path + selectedExt

    print(path)

2
这只是在对话框关闭后添加扩展名,因此无法在沙盒环境(Android,可能还包括Mac)中工作,在这些环境中,写入访问权限可能仅授予与对话框所选文件完全相同的文件。 - Audrius Meškauskas

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