Python PyQt レイアウト管理

GUIアプリケーション開発において、レイアウト管理とは、ウィンドウ内のさまざまなウィジェット(ボタン、テキストボックスなど)をどのように組織し配置するかということです。

PyQt は複数のレイアウトマネージャーを提供しており、ウィジェットの位置やサイズを自動的に調整できるため、異なるサイズのウィンドウでも良好な表示効果を維持できます。

なぜレイアウト管理が必要か

  1. さまざまな解像度への対応:ユーザーは異なるサイズの画面を使用する可能性があります
  2. 開発の簡素化:各ウィジェットの位置を手動で計算する必要がない
  3. 保守が容易:ウィジェットを追加または削除するときに、レイアウトが自動的に調整される

PyQt の主なレイアウトマネージャー

PyQt には、以下のようなよく使われるレイアウトマネージャーがあります。

1. QHBoxLayout - 水平レイアウト

ウィジェットを左から右に水平に配置します。

サンプル

layout = QHBoxLayout()
layout.addWidget(QPushButton("ボタン1"))
layout.addWidget(QPushButton("ボタン2"))
layout.addWidget(QPushButton("ボタン3"))

2. QVBoxLayout - 垂直レイアウト

ウィジェットを上から下に垂直に配置します。

サンプル

layout = QVBoxLayout()
layout.addWidget(QPushButton("ボタン1"))
layout.addWidget(QPushButton("ボタン2"))
layout.addWidget(QPushButton("ボタン3"))

3. QGridLayout - グリッドレイアウト

ウィジェットをグリッドの行と列に配置します。

サンプル

layout = QGridLayout()
layout.addWidget(QPushButton("1,1"), 0, 0)  # 0行0列
layout.addWidget(QPushButton("1,2"), 0, 1)  # 0行1列
layout.addWidget(QPushButton("2,1"), 1, 0)  # 1行0列

4. QFormLayout - フォームレイアウト

ラベルとフィールドのペアを持つフォームインターフェースを作成するのに特に適しています。

サンプル

layout = QFormLayout()
layout.addRow("名前:", QLineEdit())
layout.addRow("年齢:", QLineEdit())

レイアウトのネスト使用

実際のアプリケーションでは、複雑なインターフェースを作成するために、複数のレイアウトマネージャーを組み合わせて使用する必要がよくあります。

例:メインウィンドウのレイアウト

サンプル

# メインウィンドウを作成
window = QWidget()

# メインの垂直レイアウトを作成
main_layout = QVBoxLayout()

# 上部の水平レイアウトを追加
top_layout = QHBoxLayout()
top_layout.addWidget(QPushButton("ファイル"))
top_layout.addWidget(QPushButton("編集"))
main_layout.addLayout(top_layout)

# 中央のグリッドレイアウトを追加
center_layout = QGridLayout()
center_layout.addWidget(QTextEdit(), 0, 0, 2, 2)  # 2行2列を占有
center_layout.addWidget(QPushButton("保存"), 0, 2)
center_layout.addWidget(QPushButton("キャンセル"), 1, 2)
main_layout.addLayout(center_layout)

# 下部の水平レイアウトを追加
bottom_layout = QHBoxLayout()
bottom_layout.addStretch()  # 可変スペースを追加
bottom_layout.addWidget(QPushButton("OK"))
bottom_layout.addWidget(QPushButton("キャンセル"))
main_layout.addLayout(bottom_layout)

window.setLayout(main_layout)
window.show()

レイアウトの高度な機能

1. ストレッチ係数 (Stretch Factor)

レイアウト内のウィジェットの相対的なサイズを制御できます。

サンプル

layout = QHBoxLayout()
layout.addWidget(QPushButton("左"), stretch=1)  # 1のスペースを占める
layout.addWidget(QPushButton("中"), stretch=2)  # 2のスペースを占める
layout.addWidget(QPushButton("右"), stretch=1)  # 1のスペースを占める

2. 間隔の制御

サンプル

layout.setSpacing(10)  # ウィジェット間の間隔
layout.setContentsMargins(20, 20, 20, 20)  # レイアウトの端の余白

3. 整列方法

サンプル

button = QPushButton("ボタン")
layout.addWidget(button, alignment=Qt.AlignRight)  # 右揃え

ベストプラクティス

  1. レイアウトマネージャーを優先的に使用する:絶対配置(setGeometry)の使用を避ける
  2. レイアウトを適切にネストする:異なるレイアウトを組み合わせて複雑なインターフェースを作成する
  3. 伸縮スペースを使用する:さまざまなサイズでインターフェースを良好に表示する
  4. 一貫性を保つ:類似したインターフェース要素には同じレイアウト方法を使用する
  5. さまざまな解像度でテストする:さまざまな画面サイズでインターフェースが正常に動作することを確認する

PyQt のレイアウト管理システムを習得することで、プロフェッショナルで美しく、適応性の高い GUI アプリケーションのインターフェースを作成できます。

その他の拡張