2016-07-04 2 views
0

Qt 5とQFileDialogを使用しています。私はファイル名にスラッシュ(/)を付けるようにユーザーを制限したい。QFileDialog:ファイル名を取得

ファイル名を保存するQFileDialogのコードは以下のとおりです。次に、ユーザは、「ダウンロード」フォルダ内のファイル名「abc.csv」を与える場合

QFileDialog saveAsdialog(this); 
QString filename = saveAsdialog.getSaveFileName(this, tr("Save 
file"), ".", tr("Files (*.csv)")); 

はダイアログで、「getSaveFileNameは」正しい「/home/user/Downloads/abc.csv」を返します。

私の質問は、ユーザーがファイル名(/)にスラッシュを付けると正しく動作しないことです。

ユーザーがファイル名 "abc/xyz.csv"を指定したい場合は、正しいファイル名を取得できません。

「OK」をクリックすると正しいファイル名「abc/xyz.csv」を取得するにはどうすればよいですか?

+0

あなたが、その場合には取得しないものに、より詳しく説明してください、そして、あなたの期待は何であることはできますか? – majk

+0

私の期待は、ダイアログボックスでユーザーがファイル名を "abc/xyz.csv"と指定したときに、ユーザーが[OK]ボタンを押してダイアログを閉じるときにファイル名を抽出したい場合です。私は "/home/user/Downloads/abc/xyz.csv"のようなフルパスを取得しています。このパスからは、ユーザーが指定したファイル名を見つけることができません。ユーザーがダイアログを閉じると、ダイアログでユーザーが指定した正確なファイル名をどのように取得するのですか? – Neel

+0

@Neel少なくとも、QFileDialogを派生させて、必要なチェックで 'accept'メソッドを再実装することができます。 – ilotXXI

答えて

2

このwikipedia linkでご覧ください。

ご覧のとおり、/文字はファイル名で禁止されています。したがって、ファイル名はabc/xyz.csvです。

また、ファイルダイアログで現在のディレクトリをチェックすることもできます。この情報に基づいて、選択したファイル名を追跡できます。これを試してみてください:

QFileDialog saveAsdialog(this); 
QString curDir(QDir('.').absolutePath()); 
connect(&saveAsdialog, &QFileDialog::directoryEntered, [&curDir](const QString& dir) { 
    curDir = dir; 
}); 
// We cann't use static member getSaveFileName 
//QString filename = saveAsdialog.getSaveFileName(this, tr("Save file"), ".", tr("Files (*.csv)")); 
//here manual saveAsdialog setup 
........... 
if (saveAsdialog.exec() == QDialog::Accepted) { 

    QString filename = saveAsdialog.selectedFiles().first(); //add check that list is not empty!!! 
    QString f = filename.replace(curDir, ""); 
} 
+0

異なるダイアログでは、ユーザーはファイル名に '/'を入力することも、入力しないこともできます。ネイティブWindowsダイアログでは、これはまったく許可されません。 Qtダイアログはそれを許可し、 'abc/xyz.csv'をカレントディレクトリの' abc'サブディレクトリの 'xyz.csv'ファイルとして扱います。しかし、それは 'abc'の存在をチェックしません。 ** P.S。**:それは大きな問題であるとは確信していません。ファイルを開くことができない場合はエラーを表示するだけです。 – ilotXXI

+0

あなたは正しいです。ちょうどあなたのために、情報を開くエラーファイルはlinuxにしか来ませんが、Mac OSでは "/"はファイル名の ":"に変換されます。 Macファイル名では、abc/xyz.csvはQt abc:xyz.csvによって変換されます。それは1つの回避策かもしれませんが、ユーザーがダイアログを閉じたときにダイアログからのみファイル名を抽出する方法はありますか?例えばユーザーが "abc/xyz.csv"というファイル名を付けて "/ home/user/Downloads"フォルダに保存すると、 "/home/user/Downloads/abc/xyz.csv"のような完全なパスが得られます。ユーザーがダイアログを閉じると、ダイアログでユーザーが指定したファイル名を正確に見つけることができません。 – Neel

+0

@Evgeny。コメントありがとうございます。私はあなたのパッチを試しましたが、私はファイルを開くファイルではないダイアログを保存します。ファイルの保存ダイアログでは、ファイルの名前を入力します。あなたのソリューションを試しましたが、既存のフォルダから開いているファイルを要求しています。 – Neel

関連する問題