Python PyQt レイアウト管理
GUIアプリケーション開発において、レイアウト管理とは、ウィンドウ内のさまざまなウィジェット(ボタン、テキストボックスなど)をどのように組織し配置するかということです。
PyQt は複数のレイアウトマネージャーを提供しており、ウィジェットの位置やサイズを自動的に調整できるため、異なるサイズのウィンドウでも良好な表示効果を維持できます。
なぜレイアウト管理が必要か
- さまざまな解像度への対応:ユーザーは異なるサイズの画面を使用する可能性があります
- 開発の簡素化:各ウィジェットの位置を手動で計算する必要がない
- 保守が容易:ウィジェットを追加または削除するときに、レイアウトが自動的に調整される
PyQt の主なレイアウトマネージャー
PyQt には、以下のようなよく使われるレイアウトマネージャーがあります。
1. QHBoxLayout - 水平レイアウト
ウィジェットを左から右に水平に配置します。
サンプル
layout = QHBoxLayout()
layout.addWidget(QPushButton("ボタン1"))
layout.addWidget(QPushButton("ボタン2"))
layout.addWidget(QPushButton("ボタン3"))
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"))
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列
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())
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()
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のスペースを占める
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) # レイアウトの端の余白
layout.setContentsMargins(20, 20, 20, 20) # レイアウトの端の余白
3. 整列方法
サンプル
button = QPushButton("ボタン")
layout.addWidget(button, alignment=Qt.AlignRight) # 右揃え
layout.addWidget(button, alignment=Qt.AlignRight) # 右揃え
ベストプラクティス
- レイアウトマネージャーを優先的に使用する:絶対配置(setGeometry)の使用を避ける
- レイアウトを適切にネストする:異なるレイアウトを組み合わせて複雑なインターフェースを作成する
- 伸縮スペースを使用する:さまざまなサイズでインターフェースを良好に表示する
- 一貫性を保つ:類似したインターフェース要素には同じレイアウト方法を使用する
- さまざまな解像度でテストする:さまざまな画面サイズでインターフェースが正常に動作することを確認する
PyQt のレイアウト管理システムを習得することで、プロフェッショナルで美しく、適応性の高い GUI アプリケーションのインターフェースを作成できます。
その他の拡張