\ 迷ったらまずTechAcademyの無料カウンセリング! /
PySide超入門【第16回】ダイヤログを制御する!QDialogとQFileDialogの徹底解説

GUIアプリでは、ファイルの保存や設定変更など、ユーザーとのやり取りに「ダイアログ」がよく使われます。PySideでは QDialog
や QFileDialog
を使うことで、カスタムダイアログやファイル選択ダイアログなどを簡単に実装できます。
本記事では、QDialog
と QFileDialog
の基本的な使い方から、よく使うプロパティ・メソッドの完全解説、実践的な使い方までを丁寧に解説します。
QDialogとQFileDialogとは?
QDialog
ユーザーに入力や選択を促すためのウィンドウを作成するためのクラスです。例えば、確認ダイアログや設定画面、名前の入力フォームなどで使われます。通常、exec()
メソッドを使ってモーダル表示(操作完了まで他のウィンドウをブロック)します。
QFileDialog
ファイルやフォルダを選択するための専用ダイアログを提供するクラスです。getOpenFileName()
やgetSaveFileName()
などの静的メソッドを使うことで、ファイル選択ダイアログを手軽に表示することができます。
基本コード
from PySide6.QtWidgets import (
QApplication, QMainWindow, QPushButton, QDialog, QVBoxLayout,
QLabel, QFileDialog, QWidget
)
import sys
class CustomDialog(QDialog):
def __init__(self):
super().__init__()
self.setWindowTitle("カスタムダイアログ")
layout = QVBoxLayout()
layout.addWidget(QLabel("これはQDialogです"))
self.setLayout(layout)
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("QDialogとQFileDialog")
btn_dialog = QPushButton("QDialogを開く")
btn_dialog.clicked.connect(self.open_dialog)
btn_file = QPushButton("ファイルを開く")
btn_file.clicked.connect(self.open_file)
layout = QVBoxLayout()
layout.addWidget(btn_dialog)
layout.addWidget(btn_file)
container = self.centralWidget() or QWidget()
container.setLayout(layout)
self.setCentralWidget(container)
def open_dialog(self):
dialog = CustomDialog()
dialog.exec() # モーダル表示
def open_file(self):
filename, _ = QFileDialog.getOpenFileName(self, "ファイルを開く", "", "すべてのファイル (*)")
if filename:
print(f"選択されたファイル: {filename}")
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()
QMainWindow | QDialog | QFileDialog |
---|---|---|
![]() | ![]() | ![]() |
主なプロパティとメソッド一覧(全解説)
No | メソッド / プロパティ | 説明 | 例 |
---|---|---|---|
1 | setModal(bool) | モーダルモードを有効化または無効化 | dialog.setModal(True) |
2 | exec() / open() / show() | QDialogを表示する | dialog.exec() |
3 | accept() / reject() | OK / Cancel などの応答に使われる | dialog.accept() |
4 | setWindowTitle(str) | ダイアログのタイトルを設定 | dialog.setWindowTitle("設定") |
5 | setLayout(QLayout) | ダイアログにレイアウトを設定 | dialog.setLayout(QVBoxLayout()) |
6 | getOpenFileName(…) | QFileDialogでファイル選択 | QFileDialog.getOpenFileName(...) |
7 | getSaveFileName(…) | QFileDialogでファイル保存 | QFileDialog.getSaveFileName(...) |
8 | getExistingDirectory(…) | ディレクトリ選択 | QFileDialog.getExistingDirectory(...) |
9 | setDirectory(str) | 初期ディレクトリを設定 | dialog.setDirectory("/home/user") |
10 | selectedFiles() | 選択されたファイルの一覧を取得 | dialog.selectedFiles() |
各プロパティ・メソッド 詳細解説
【1】モーダルの設定(setModal()
とexec()
の違い)
ダイアログには「モーダル」と「モーダルレス」という2つの表示モードがあります。
- モーダル:ダイアログが閉じられるまで他のウィンドウを操作できない(ブロックされる)
- モーダルレス:ダイアログを開いたままでも他のウィンドウを操作できる
モーダルにする方法
方法 | 説明 |
---|---|
setModal(True) | show() と組み合わせてモーダル表示にする |
exec() | 自動的にモーダル表示になる |
しかし、show()
で表示する場合には、インスタンスを保持しないとすぐ閉じてしまうという注意点があります。
コード例
exec()
def open_dialog(self):
dialog = QDialog()
dialog.exec() # 自動的にモーダル表示
setModal(True)
def open_dialog(self):
self.dialog = CustomDialog()
self.dialog.setModal(True) # モーダルにする
self.dialog.show() # モーダル表示
実行結果とポイント
- 「exec() でモーダル表示」ボタンを押すと、完全にモーダルなダイアログが表示されます。
dialog.exec()
が処理をブロックします。 - 「setModal(True) + show()」ボタンでは、
setModal(True)
によりモーダルになりますが、self.dialog
としてインスタンスを保持しないと、一瞬で閉じてしまいます。
注意点まとめ
メソッド | モーダル化 | UIブロック | スコープの注意 |
---|---|---|---|
exec() | 自動的にモーダル | あり | 一時変数でもOK |
setModal(True) + show() | モーダル | あり | インスタンス保持が必要 |
【2】exec()
/ open()
/ show()
の違い
QDialogを表示する方法は主に3つありますが、それぞれの動作には明確な違いがあります。
表示方法 | モーダル性 | ユーザー操作をブロックするか | 処理の流れ | イベントループ |
---|---|---|---|---|
exec() | モーダル | ブロックする | ダイアログが閉じるまで待つ | 開始される |
open() | モーダル | ブロックしない | すぐ次の処理に進む | 開始されない(シグナルで制御) |
show() | モデルレス | ブロックしない | すぐ次の処理に進む | 開始されない |
exec()
は「完全モーダル」で、他のウィンドウを操作できず、プログラムの処理も一時停止します。open()
は「非同期モーダル」で、操作は制限されますが、コードの処理は止まりません(シグナルで後処理)。show()
は「モデルレス」なので、同時に複数のウィンドウを扱いたいときに適しています。
exec()
def open_dialog(self):
dialog = CustomDialog()
dialog.show() # モーダル表示
open()
def open_dialog(self):
self.dialog = CustomDialog()
self.dialog.open() # モーダル表示
show()
def open_dialog(self):
self.dialog = CustomDialog()
self.dialog.show() # 非モーダル表示
【3】OK/Cancelの応答処理
- 概要:
QDialog
ではaccept()
でOK処理、reject()
でキャンセル処理を行います。exec()
によってダイアログが閉じられる際に、これらのメソッドが返り値として利用されます。 - メソッド:
accept()
/reject()
- 使い方:
def open_dialog(self):
dialog = CustomDialog()
result = dialog.exec() # モーダル表示(結果を受け取れる)
if result == QDialog.Accepted:
print("OKが押されました")
elif result == QDialog.Rejected:
print("キャンセルされました")
exec()
を使うと、ダイアログが閉じられるまで処理をブロックし、終了時の戻り値でOK/Cancelの判断ができます。accept()
とreject()
は、それぞれQDialog.Accepted
(値=1)とQDialog.Rejected
(値=0)を返します。- モーダルな選択ダイアログ(確認、入力など)でよく使用されます。
【4】タイトルを設定する
- 概要: ダイアログのウィンドウタイトルを設定します。
- メソッド:
setWindowTitle(str)
- 使い方:
def open_dialog(self):
dialog = CustomDialog()
dialog.setWindowTitle("設定ダイアログ")

【5】レイアウトを設定する
- 概要: ダイアログに表示するウィジェット(ラベル・ボタンなど)を配置するためにレイアウトを設定します。
QDialog
はデフォルトではレイアウトを持たないため、明示的にsetLayout()
で設定する必要があります。 - メソッド:
setLayout(QLayout)
- 使い方:
class CustomDialog(QDialog):
def __init__(self):
super().__init__()
self.setWindowTitle("カスタムダイアログ")
layout = QVBoxLayout()
layout.addWidget(QLabel("これはQDialogです"))
self.setLayout(layout)
【6】ファイルを開く
- 概要: ファイル選択ダイアログを表示します。
- メソッド:
getOpenFileName(...)
- 使い方:
def open_file(self):
filename, _ = QFileDialog.getOpenFileName(self, "ファイルを開く", "", "すべてのファイル (*)")
if filename:
print(f"選択されたファイル: {filename}")
【7】ファイルを保存する
- 概要: 保存用ファイルパスを選択させます。
- メソッド:
getSaveFileName(...)
- 使い方:
filename, _ = QFileDialog.getSaveFileName(self, "保存")
【8】ディレクトリを選択する
- 概要: フォルダ選択ダイアログを表示します。
- メソッド:
getExistingDirectory(...)
- 使い方:
dirpath = QFileDialog.getExistingDirectory(self, "フォルダ選択")
【9】初期ディレクトリの設定
- 概要: ファイルダイアログの初期フォルダを指定します。
- メソッド:
setDirectory(str)
- 使い方:
dialog.setDirectory("/home/user/")
【10】選択されたファイルを取得
- 概要: ファイル選択後のファイル名を取得します。
- メソッド:
selectedFiles()
- 使い方:
files = dialog.selectedFiles()
よくある質問(FAQ)
exec()
とopen()
の違いは?-
exec()
はモーダル表示、open()
はモデルレス表示になります。 - QDialogの閉じ方を制御できますか?
-
はい。
accept()
/reject()
をボタンに接続することで可能です。 - ファイル選択ダイアログに初期フォルダを設定するには?
-
QFileDialog.getOpenFileName()
の第3引数にパスを渡します。 - QFileDialogで複数ファイルを選択するには?
-
getOpenFileNames()
を使用します。 - QDialogで入力フォームを作るには?
-
QLineEdit
やQFormLayout
を使ってカスタムダイアログを作成します。
まとめ
QDialog
はユーザーとのやりとりを行うためのポップアップウィンドウであり、独自の内容を自由にレイアウトできるのが特徴です。一方、QFileDialog
はファイル選択専用のダイアログで、わずかなコードで便利なファイル操作UIを実現できます。
ダイアログの基本構造や使い方を理解することで、よりインタラクティブで実用的なGUIアプリを構築できるようになります。
次回(第17回)では、レイアウト管理の基本と実践(QVBoxLayout, QHBoxLayout, QGridLayout)について詳しく解説します。
複雑なウィジェット配置も、レイアウトクラスを使えば簡単に整理できます。ぜひご期待ください。

コメント