【问题标题】:QFileDialog: adding extension automatically when saving file?QFileDialog:保存文件时自动添加扩展名?
【发布时间】:2010-12-29 13:05:26
【问题描述】:

当使用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 不会自动添加扩展名。我的问题:我该如何改变这个?

【问题讨论】:

  • Qt 文档清晰而全面,我想知道你怎么可能错过了 QFileDialog::setDefaultSuffix()
  • 看起来很多工作只是为了做同样的事情:QFileDialog::getSaveFileName()。我错过了什么吗?
  • @Julien L.:我通常会尝试回答问题,而不是质疑需求,尤其是对于像这样的简单查询。但是,如果 OP 会打开我链接到的页面并搜索“扩展名”,他只会找到“setNameFilter”的示例,而没有其他与默认后缀相关的内容。
  • @cjhuitt:正是,这就是我问这个(容易回答)问题的原因

标签: c++ qt qt4 save qfiledialog


【解决方案1】:

你可以使用QFileDialog::setDefaultSuffix():

如果没有指定其他后缀,则此属性保存添加到文件名的后缀。

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

【讨论】:

  • 在允许多种文件类型时如何做到这一点?例如,“All-Files (.pdf *.txt);;PDF-Files(.pdf)”并且用户选择了第二个条目,PDF-Files?
  • @manatttta 虽然不是很简单,但应该可以继承QFileDialog,将filterSelected() 信号连接到在过滤器字符串中搜索第一个文件扩展名的槽,然后调用@987654324 @用它。
【解决方案2】:

对于多个文件过滤器,可以做到以下几点。

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)

【讨论】:

    猜你喜欢
    • 2015-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    • 1970-01-01
    相关资源
    最近更新 更多