[英]Is there a way to automatically add extensions to a file using QFileDialog on Linux
我希望用戶能夠輸入將保存為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);
由於您使用getSaveFileName
從對話框中獲取字符串,因此您可以執行以下操作:
if (!groupingFile.endsWith(".xml"))
groupingFile += ".xml";
它可能在Linux上有所不同,因為getSaveFileName
文檔中getSaveFileName
了這個小片段:
在Windows,Mac OS X和Symbian ^ 3上,此靜態函數將使用本機文件對話框而不是QFileDialog。
換句話說,至少就Qt而言,添加前綴(由本機對話框完成)是異常的。
正如評論中指出的那樣,您可能會發現此解決方案的一個問題是,如果您手動鍵入xyzzy
並且文件xyzzy.xml
已經存在,則對話框本身不會通知您(假設本機對話框執行此操作 - 我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
}
你看過QFileDialog :: setDefaultSuffix了嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.