簡體   English   中英

有沒有辦法在Linux上使用QFileDialog自動添加擴展名到文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM