7

さて、私は次のコードを使用して、保存する必要があるファイルのファイル名を取得しています..

QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"),"/home/user/MyDocs/",tr("JPG files (*.jpg);;BMP files (*.bmp);;PNG files (*.png)"));

ファイルを保存するファイル形式に関する多くのオプションをユーザーに提供しています。ただし、返さQStringれたのは、ユーザーが選択した接頭辞のファイル名のみであり、接尾辞ではないため、ユーザーが選択したファイル形式はわかりません。このようなファイル形式を検出するにはどうすればよいですか?

4

3 に答える 3

2

この議論を見てください。QFileInfoに入力された文字列で使用しますQFileDialog

于 2010-07-04T15:31:09.003 に答える
2

5 番目のオプションの文字列を使用する必要があります。
通常は次のようにします。

#define JPEG_FILES "JPG files (*.jpg)"
#define BMP_FILES "BMP files (*.bmp)"
#define PNG_FILES "PNG files (*.png)"

QString selectedFilter;
QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"),
        "/home/user/MyDocs/",
        JPEG_FILES ";;" BMP_FILES ";;" PNG_FILES, &selectedFilter);

if (fileName.isNull())
  return;
if (selectedFilter == JPEG_FILES) {
  ...
} else if (selectedFilter == BMP_FILES) { 
  ...
} else if (selectedFilter == PNG_FILES) {
  ...
} else {  
    // something strange happened 
}

コンパイラは、引数内のリテラル文字列を連結するように注意します。

返された文字列が とどのように相互作用するのかわかりませんtr()。テストして調べる必要があります。おそらくそれを翻訳解除する必要があります。
選択したフィルターのインデックスを関数が返すようになればもっと良かったのですが、残念ながらそうではありません。

より良い解決策は、フィルターをリストに入れ、そこから文字列を作成し、返された選択されたフィルター文字列とリスト内の文字列を比較することです。これで問題も解決しtr()ます。

于 2010-07-04T15:32:11.793 に答える
1

問題のコードは Windows (Qt 4.6.2 および Win XP) で動作します。fileName には、選択した拡張子が含まれます。ただし、明らかに Windows 以外のものを使用しているため、次の回避策を試すことができます。

QFileDialog dialog(this, tr("Save as ..."), "/home/user/MyDocs/");
dialog.setAcceptMode(QFileDialog::AcceptSave);
QStringList filters;
filters << "JPG files (*.jpg)" << "BMP files (*.bmp)" << "PNG files (*.png)";
dialog.setNameFilters(filters);
if (dialog.exec() == QDialog::Accepted)
{
    QString selectedFilter = dialog.selectedNameFilter();
    QString fileName = dialog.selectedFiles()[0];
}

これは、 here からわずかに変更されたコードです

于 2010-07-04T16:28:27.493 に答える