我希望用户能够输入一个文件的名称,将被保存为xml文件。目前在Windows和Mac上,如果你输入"test“作为文件名,它会自动添加".xml”,这就是我想要的。不幸的是,在测试Linux构建时,我发现输入一个不带扩展名的文件名将保存为一个普通文件。用户必须在文件字符串中指定扩展名(即"test.xml"),以便以正确的格式保存。
我使用的代码如下所示。这是一个Qt bug吗?或者有没有办法在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);
发布于 2012-03-22 12:25:46
由于您使用getSaveFileName
从对话框中获取字符串,因此您只需执行以下操作:
if (!groupingFile.endsWith(".xml"))
groupingFile += ".xml";
在Linux上可能会有所不同,因为getSaveFileName
文档中隐藏了这个小片段。
在Window、Mac和Symbian^3上,此静态函数将使用本机文件对话框而不是QFileDialog。
换句话说,添加前缀(由本地对话框完成)是异常的,至少在Qt方面是这样。
正如评论中指出的,你可能会发现这个解决方案的一个问题,如果你手动输入xyzzy
并且文件xyzzy.xml
已经存在,对话框本身不会通知你(假设本机对话框做到了这一点-我实际上还没有检查过)。如果你想要这个行为,你也需要实现它。
发布于 2012-03-22 12:44:45
我们创建了自己的保存对话框方法来解决这个问题。解决方案基本上与@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
}
发布于 2013-06-27 06:08:50
你看过QFileDialog::setDefaultSuffix吗?
https://stackoverflow.com/questions/9822177
复制相似问题