有没有办法在 Linux 上使用 QFileDialog 自动向文件添加扩展名
Posted
技术标签:
【中文标题】有没有办法在 Linux 上使用 QFileDialog 自动向文件添加扩展名【英文标题】:Is there a way to automatically add extensions to a file using QFileDialog on Linux 【发布时间】:2012-03-22 12:21:14 【问题描述】:我希望用户能够为将保存为 xml 文件的文件输入名称。目前在 Windows 和 Mac 上,如果您输入“test”作为文件名,它将自动添加我想要的“.xml”。不幸的是,在测试 Linux 构建时,我发现输入不带扩展名的文件名会保存为普通文件。用户必须在文件字符串中指定扩展名(即“test.xml”)才能以正确的格式保存。
我正在使用的代码如下。这是一个 Qt 错误还是有办法在 Qt 中指定如果找不到扩展,它应该添加一个扩展?
// Get value for "dir". If the setting doesn't exist then use
// the the path in "defaultsave.directory"
QString prevPath = prevValues.value("dir", QString::fromStdString(
ConfigService::Instance().getString("defaultsave.directory"))).toString();
QString filter;
filter.append("Files (*.xml)");
filter += ";;AllFiles (*.*)";
QString groupingFile = QFileDialog::getSaveFileName(this, "Save Grouping file as", prevPath, filter);
【问题讨论】:
您是否已经考虑过有关平台细节的文档? 我已在最初请求此功能的错误报告中添加了一条评论(并声称已修复):bugreports.qt-project.org/browse/QTBUG-27186#comment-248985 QFileDialog: adding extension automatically when saving file?的可能重复 @vsz,您是否检查过建议的解决方案是否适用于此处使用的静态调用,getSaveFileName
?我知道它适用于实际的 QFileDialog
对象,我只是不确定静态函数,因为它们显然并不总是使用 QFileDialog
。
【参考方案1】:
由于您从对话框中使用getSaveFileName
获取字符串,因此您可以执行以下操作:
if (!groupingFile.endsWith(".xml"))
groupingFile += ".xml";
在 Linux 上可能会有所不同,因为 getSaveFileName
的文档中隐藏了这个小 sn-p:
在 Windows、Mac OS X 和 Symbian^3 上,此静态函数将使用本机文件对话框,而不是 QFileDialog。
换句话说,是添加前缀(由本地对话框完成)是异常的,至少在 Qt 方面是这样。
正如 cmets 中所指出的,您可能会发现此解决方案存在一个问题,即如果您手动输入 xyzzy
并且文件 xyzzy.xml
已经存在(假设本机对话框),对话框本身不会通知您这样做 - 我实际上没有检查过)。如果你想要这种行为,你也需要实现它。
【讨论】:
我正忙于让 QFileDialog 工作,我忘了看明显的解决方案。谢谢。我仍然想知道为什么 QFileDialog 的功能与 Linux 版本不同。 @RobertWhitley,看我的更新,有一点 doco 说明这些静态函数实际上并不使用QFileDialog
。
这种方法有一个缺点:如果您使用QFileDialog::confirmOverwrite
(默认),QFileDialog 会测试与您实际写入的文件名不同的文件名。解决方案是通过QFileDialog::DontConfirmOverwrite
并执行您自己的确认对话框,或者使用QFileDialog::defaultSuffix
,这在QFileDialog::getSaveFileName
中是不可用的。无论哪种方式,您都需要比静态函数调用更多的代码。 :-(
-1:这个重复问题的原件提供了正确答案。此答案存在未检查正确文件以进行覆盖的问题
@vsz,我会怎么想?我认为内存泄漏是长时间运行的程序中的错误,但与短期运行的程序无关。就像“上下文很重要”一样。但是,我在答案中指出这是人们可能想要考虑的事情。如果您认为它可以改进,我很高兴(并且足够自负)接受任何建议 :-) 感谢您迄今为止的意见,我非常感谢。【参考方案2】:
我们创建了自己的保存对话框方法来解决这个问题。该解决方案与@paxdiablo 的答案基本相同(只需添加扩展名),但这更通用:
QString ShowSaveFileDialog(QWidget *parent,
const QString &title,
const QString &directory,
const QString &filter)
#if defined(Q_WS_WIN) || defined(Q_WS_MAC)
return QFileDialog::getSaveFileName(parent,
title,
directory,
filter);
#else
QFileDialog dialog(parent, title, directory, filter);
if (parent)
dialog.setWindowModality(Qt::WindowModal);
QRegExp filter_regex(QLatin1String("(?:^\\*\\.(?!.*\\()|\\(\\*\\.)(\\w+)"));
QStringList filters = filter.split(QLatin1String(";;"));
if (!filters.isEmpty())
dialog.setNameFilter(filters.first());
if (filter_regex.indexIn(filters.first()) != -1)
dialog.setDefaultSuffix(filter_regex.cap(1));
dialog.setAcceptMode(QFileDialog::AcceptSave);
if (dialog.exec() == QDialog::Accepted)
QString file_name = dialog.selectedFiles().first();
QFileInfo info(file_name);
if (info.suffix().isEmpty() && !dialog.selectedNameFilter().isEmpty())
if (filter_regex.indexIn(dialog.selectedNameFilter()) != -1)
QString extension = filter_regex.cap(1);
file_name += QLatin1String(".") + extension;
return file_name;
else
return QString();
#endif // Q_WS_MAC || Q_WS_WIN
【讨论】:
这不支持多个可能的过滤器,是吗?【参考方案3】:你看过 QFileDialog::setDefaultSuffix 吗?
【讨论】:
以上是关于有没有办法在 Linux 上使用 QFileDialog 自动向文件添加扩展名的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法使用 C 程序在 .txt 文件上获取 linux 命令(如 ifconfig)的输出? [复制]