yam’s Lab

ハマったこと、学んだことを備忘録として記事にします。主にC++,Qt,ROS,Pythonについて取り扱います。

QFileDialogでfileとdirectory両方を選択可能とする。

QFileDialogはファイルなどを開いたり保存するウインドウを作成するクラスです。
中でもstatic関数を使用することでファイルやフォルダのopen、save用のウインドウを簡単に作成できます。

今回、一つのウィンドウからファイルとフォルダ両方を開きたかったのですが、ちょっと実装に手間取ったので記録します。
windowsmacubuntuで動作確認したところ、mac以外では正常に動作しないようです。

環境:python3.6.8, PyQt5
リファレンス:QFileDialog Class | Qt Widgets 5.15.0

PyQt5での実装

        dialog = QFileDialog()
        ret_data = []
        if dialog.exec():
            ret_data = dialog.selectedFiles()
        print(ret_data)

簡単に解説すると、static関数で実装されているgetExistingDirectory()やgetOpenFileName()を使うとdirectoryかfileのいずれかのパスしか取得できません。
そのため、QFileDialogの表示モードなどを自前で設定し、表示する必要があります。

ただし、FileModeはデフォルトでAnyFile、つまり存在するかどうかに関係なくファイル名を選択できる状態ですし、Optionにも表示をディレクトリのみに制限するオプションも有効になっていませんので特に設定する必要もありません。
したがって、3行目のdialog.exec()を実行することでファイルダイアログを表示できます。

exec()は親クラスのQDialog::exec()を呼び出しています。
この関数はダイアログを表示し、表示がダイアログの処理が終了するまで他の処理をブロックします。
また、正常終了時には1、キャンセルなどの異常終了時には0を返却します。

そのため、4行目では正常終了した場合に画面に表示したダイアログで選択されたファイルを取得するようにしています。