PySide超入門【第16回】ダイヤログを制御する!QDialogとQFileDialogの徹底解説

\ 迷ったらまずTechAcademyの無料カウンセリング! /

GUIアプリでは、ファイルの保存や設定変更など、ユーザーとのやり取りに「ダイアログ」がよく使われます。PySideでは QDialogQFileDialog を使うことで、カスタムダイアログやファイル選択ダイアログなどを簡単に実装できます。

本記事では、QDialogQFileDialog の基本的な使い方から、よく使うプロパティ・メソッドの完全解説、実践的な使い方までを丁寧に解説します。

目次

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()
QMainWindowQDialogQFileDialog

主なプロパティとメソッド一覧(全解説)

Noメソッド / プロパティ説明
1setModal(bool)モーダルモードを有効化または無効化dialog.setModal(True)
2exec() / open() / show()QDialogを表示するdialog.exec()
3accept() / reject()OK / Cancel などの応答に使われるdialog.accept()
4setWindowTitle(str)ダイアログのタイトルを設定dialog.setWindowTitle("設定")
5setLayout(QLayout)ダイアログにレイアウトを設定dialog.setLayout(QVBoxLayout())
6getOpenFileName(…)QFileDialogでファイル選択QFileDialog.getOpenFileName(...)
7getSaveFileName(…)QFileDialogでファイル保存QFileDialog.getSaveFileName(...)
8getExistingDirectory(…)ディレクトリ選択QFileDialog.getExistingDirectory(...)
9setDirectory(str)初期ディレクトリを設定dialog.setDirectory("/home/user")
10selectedFiles()選択されたファイルの一覧を取得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で入力フォームを作るには?

QLineEditQFormLayout を使ってカスタムダイアログを作成します。

まとめ

QDialogはユーザーとのやりとりを行うためのポップアップウィンドウであり、独自の内容を自由にレイアウトできるのが特徴です。一方、QFileDialogはファイル選択専用のダイアログで、わずかなコードで便利なファイル操作UIを実現できます。

ダイアログの基本構造や使い方を理解することで、よりインタラクティブで実用的なGUIアプリを構築できるようになります。

次回(第17回)では、レイアウト管理の基本と実践(QVBoxLayout, QHBoxLayout, QGridLayout)について詳しく解説します。
複雑なウィジェット配置も、レイアウトクラスを使えば簡単に整理できます。ぜひご期待ください。

シェアしてくださると嬉しいです!
  • URLをコピーしました!

コメント

コメントする

目次