主にPySide2での場合です。
次のようなことを実現したかった
- 複数のファイルを選択させる
- 単一のファイルを選択させる
- それらファイルパスを取得したい
これはQFileDialogを使えば簡単にできます。
しかも同期的に処理ができるので、
SLOT関数とかも用意する必要ありません。
そこでQFileDialogの基本的な使い方、
それを色々まとめてみたいと思います
このページの目次
PySide・PyQtのどちらでも有効な方法だと思う
まず僕自身のGUI開発の環境について
▼ このような環境
- PySide2(PySide6)を使用
- minicondaで仮想環境作成
▼ PySide環境構築は次記事でもまとめた
ライセンス的にPyQtは使いたくありません。
それだから互換性のあるPySideを使ってる訳です。
ただしこれから紹介するファイルダイアログの出し方。
それはPySide・PyQtでほぼ変わらないはずです。
QFileDialogから単一ファイルパスを取得するコード例
初めは単一ファイルの選択・パス取得から
実際にコードを書いてみました。
▼ 1つだけファイル選択するコード例(画像のみ)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
caption = "Select a file" dir = "" filter = "Images (*.png *.jpg)" selectedFilter = "" options = QFileDialog.Options() fileName = QFileDialog.getOpenFileName( None, caption, dir, filter, selectedFilter, options ) print(fileName) |
▼ 適当なPNG画像を選択時の出力結果
1 |
('C:/path/to/images/hoge.png', 'Images (*.png *.jpg)') |
「 QFileDialog.getOpenFileName() 」
これを使えば単一ファイル取得できます。
5つの引数を取り、それぞれ次の意味を持ちます。
- caption
ファイルダイアログのタイトルバーに表示されるテキスト
- dir
ファイルダイアログ起動時に移動したい初期ディレクトリパス。基本的に必要ないと思う。もし必要ないなら空文字列を渡しておけばOK
- filter
絞込みフィルター。構文は [ヒントテキスト] (*.[拡張子1] *.[拡張子2] ...) のような形式。この例では *.png *.jpeg とすることで画像のみをフィルターしている
- selectedFilter
詳細はリファレンスを見た多だけではわからなかった。初期状態で選択されているファイルを指定する時などに使うのかな?詳しく知りたい人はググってほしい
- options
なんか色々。オプション
大事なのは filter の引数ですね。
ここでは "Images (*.png *.jpg)" と指定してPNG/JPEG画像だけ選択させてます。もしテキスト形式だけ受け付けたいなら "Text files (*.txt)" みたいに指定できます。
QFileDialogから複数ファイルパスの取得コード例
次は複数ファイルの場合
単一ファイルの場合とさほど変わりないです。
▼ 例えばこのようなコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
caption = "Select files" dir = "" filter = "Images (*.png *.jpg)" selectedFilter = "" options = QFileDialog.Options() fileNames = QFileDialog.getOpenFileNames( None, caption, dir, filter, selectedFilter, options ) print(fileNames) |
▼ 5つほどファイル選択した時の出力結果
1 |
(['C:/path/to/images/1.png', 'C:/path/to/images/2.png', 'C:/path/to/images/3.png', 'C:/path/to/images/4.png', 'C:/path/to/images/5.png'], 'Images (*.png *.jpg)') |
「 QFileDialog.getOpenFileNames() 」
今度はこのメソッドを使います。
といっても引数は getOpenFileName() と変わりません。
拡張子でファイル種類をフィルターできるし、タイトルキャプションとか初期ディレクトリ変更のやり方も全く同じです。
違いはファイルパス配列が返ることだけです。
ファイルダイアログはOSネイティブが起動される
起動するファイルダイアログはOSネイティブです。
▼ Windowsだったらいつものが起動する
ネイティブだから違和感もありません。
ということでPySideでのファイルダイアログの出し方でした。
PySideでも頻繁に使うことになるAPIだと思います。ではまた