Есть ли способ автоматически добавлять расширения в файл с помощью QFileDialog в Linux
Я хочу, чтобы пользователь мог ввести имя файла, который будет сохранен как XML-файл. В настоящее время на Windows и Mac, Если вы введете "тест" в качестве имени файла, он автоматически добавит ".xml", что я и хочу. К сожалению, при тестировании сборки Linux я обнаружил, что ввод имени файла без расширения будет сохранен как обычный файл. Пользователь должен указать расширение в строке файла (i.e " тест.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);
3 ответов
С вы получить строку из диалога с getSaveFileName
, вы можете просто сделать что-то вроде:
if (!groupingFile.endsWith(".xml"))
groupingFile += ".xml";
вероятно, это отличается от Linux из-за этого маленького фрагмента, похороненного в документации для getSaveFileName
:
в Windows, Mac OS X и Symbian^3 Эта статическая функция будет использовать собственный диалог файлов, а не QFileDialog.
другими словами, это добавление префикса (сделано dialogs), который является аберрантным, по крайней мере, с точки зрения Qt.
как указано в комментариях, вы можете найти проблему с этим решением в том, что само диалоговое окно не уведомит вас, если вы введете xyzzy
вручную и файлом xyzzy.xml
уже существует (предполагая, что собственные диалоги делают это-я на самом деле не проверял). Если вы хотите такого поведения, вам также нужно его реализовать.
мы создали собственный метод диалога сохранения, чтобы обойти это. Решение по существу такое же, как и ответ @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
}