\ 迷ったらまずTechAcademyの無料カウンセリング! /
PySide超入門【第17回|応用編】QLayout完全ガイド|QHBoxLayout・QVBoxLayout・QGridLayout

「PySideでウィジェットを並べるにはどうすればいいの?」「QHBoxLayout
やQVBoxLayout
の違いがいまいち分からない…」そんな悩みはありませんか?
本記事では、PySideのレイアウト管理に使うQLayoutの基本と応用を徹底解説します。QHBoxLayout
, QVBoxLayout
, QGridLayout
の違いや使い分け、プロパティ・メソッド一覧と詳細なサンプルコードを通して、実践的なUI配置がすぐにできるようになります。
QHBoxLayout, QVBoxLayout, QGridLayoutとは?
概要
QHBoxLayout
ウィジェットを横一列に並べるためのレイアウトクラスです。ボタンや入力欄などを水平方向に並べたい場合に使います。
QVBoxLayout
ウィジェットを縦一列に並べるレイアウトです。フォームや設定画面など、要素を上から順に並べたいときに適しています。
QGridLayout
ウィジェットを格子状(行×列)に配置できるレイアウト。複雑な構成や表形式のUIに向いています。
基本コード
from PySide6.QtWidgets import (
QApplication, QWidget, QPushButton,
QHBoxLayout, QVBoxLayout, QGridLayout
)
app = QApplication([])
# HBoxLayout例
hbox = QHBoxLayout()
hbox.addWidget(QPushButton("Button 1"))
hbox.addWidget(QPushButton("Button 2"))
# VBoxLayout例
vbox = QVBoxLayout()
vbox.addWidget(QPushButton("Button A"))
vbox.addWidget(QPushButton("Button B"))
# GridLayout例
grid = QGridLayout()
grid.addWidget(QPushButton("Top-Left"), 0, 0)
grid.addWidget(QPushButton("Top-Right"), 0, 1)
grid.addWidget(QPushButton("Bottom"), 1, 0, 1, 2)
#==========================
# ここにコードを追加します
#==========================
# メインウィンドウにレイアウトを適用
window = QWidget()
window.setLayout(hbox) # ←他のレイアウトに差し替えてもOK
# window.setLayout(vbox) # ←他のレイアウトに差し替えてもOK
# window.setLayout(grid) # ←他のレイアウトに差し替えてもOK
window.show()
app.exec()
QHBoxLayout | QVBoxLayout | QGridLayout |
---|---|---|
![]() | ![]() | ![]() |
主なプロパティとメソッド一覧(全解説)
No | メソッド / プロパティ | 説明 | 例 |
---|---|---|---|
1 | addWidget(widget) | ウィジェットをレイアウトに追加する | layout.addWidget(btn) |
2 | addLayout(layout) | 他のレイアウトを入れ子で追加する | layout.addLayout(sub_layout) |
3 | addSpacing(size) | 指定ピクセル分のスペースを追加する | layout.addSpacing(20) |
4 | addStretch(stretch=1) | 伸縮可能な空間を追加する | layout.addStretch() |
5 | setSpacing(pixels) | ウィジェット間のスペースを設定する | layout.setSpacing(10) |
6 | setContentsMargins(l, t, r, b) | レイアウトの余白を設定する | layout.setContentsMargins(5, 10, 5, 10) |
7 | setAlignment(widget, alignment) | ウィジェットの配置位置を設定(Qt.Align*) | layout.setAlignment(btn, Qt.AlignRight) |
8 | itemAt(index) | 指定インデックスのアイテムを取得する | layout.itemAt(0).widget() |
9 | count() | レイアウト内のアイテム数を取得 | layout.count() |
10 | takeAt(index) | 指定位置のアイテムを削除し、返す | layout.takeAt(0) |
11 | insertWidget(index, widget) | 指定位置にウィジェットを挿入する | layout.insertWidget(1, btn) |
各プロパティ・メソッド 詳細解説
【1】ウィジェットの追加
概要: ウィジェットをレイアウトに追加する。
メソッド: addWidget(widget)
使い方:
layout.addWidget(QPushButton("追加ボタン"))
QHBoxLayout | QVBoxLayout | QGridLayout |
---|---|---|
![]() | ![]() | ![]() |
【2】レイアウトの入れ子
概要: 他のレイアウトを内部に追加し、複雑な構成を作る。
メソッド: addLayout(layout)
使い方:
grid.addLayout(hbox, 2, 0)
grid.addLayout(vbox, 2, 1)

【3】固定スペースの挿入
概要: 一定のスペースを空けたいときに使う。
メソッド: addSpacing(size)
使い方:
hbox.addSpacing(30)
addSpacing(0) | addSpacing(30) |
---|---|
![]() | ![]() |
【4】伸縮空間の挿入
概要: 空白部分に余白を与えて調整可能にする。ウィンドウをマウスで伸ばしてもボタンサイズは変わりません
メソッド: addStretch()
使い方:
hbox.addStretch()

【5】ウィジェット間のスペース
概要: 各ウィジェット間の距離を設定。
メソッド: setSpacing(pixels)
使い方:
hbox.setSpacing(30)
addSpacing(0) | setSpacing(30) |
---|---|
![]() | ![]() |
【6】外枠マージン設定
概要: レイアウトの周囲に余白を設定。
メソッド: setContentsMargins(l, t, r, b)
使い方:
hbox.setContentsMargins(40, 20, 40, 20)
setContentsMargins(0, 0, 0, 0) | setContentsMargins(40, 20, 40, 20) |
---|---|
![]() | ![]() |
【7】配置位置の調整
概要: 個々のウィジェットの配置位置を指定。
メソッド: setAlignment(widget, alignment)
使い方:
hbox = QHBoxLayout()
hbox_button1 = QPushButton("Button 1")
hbox_button2 = QPushButton("Button 2")
hbox.addWidget(hbox_button1)
hbox.addWidget(hbox_button2)
# 配置位置の調整
from PySide6.QtCore import Qt
hbox.setAlignment(hbox_button1, Qt.AlignLeft)
hbox.setAlignment(hbox_button2, Qt.AlignRight)

【8】要素の取得
概要: レイアウト内のウィジェットを取得。
メソッド: itemAt(index)
使い方:
item1 = hbox.itemAt(0).widget()
item2 = hbox.itemAt(1).widget()
print(f'Button 1: {item1}')
print(f'Button 2: {item2}')
# Button 1: <PySide6.QtWidgets.QPushButton(0x194411dba30) at 0x000001944182CBC0>
# Button 2: <PySide6.QtWidgets.QPushButton(0x194411dbbf0) at 0x000001944182CC40>
【9】要素数の取得
概要: 現在のウィジェット数を確認。
メソッド: count()
使い方:
n = hbox.count()
print(n)
# 2
【10】要素の削除
概要: 指定位置からウィジェットを削除。
メソッド: takeAt(index)
使い方:
hbox.takeAt(0)

【11】挿入
概要: 任意の位置にウィジェットを挿入。
メソッド: insertWidget(index, widget)
使い方:
hbox.insertWidget(1, QPushButton("中間ボタン"))

よくある質問(FAQ)
- レイアウトをネスト(入れ子)にしても動かないのはなぜ?
-
入れ子にしたレイアウトを最終的に親ウィジェットに
setLayout()
しているか確認してください。 - スペーシングとストレッチの違いは?
-
addSpacing
は固定幅、addStretch
はウィンドウサイズに応じて伸縮します。 - QGridLayoutのセルを結合できますか?
-
はい、
addWidget(widget, row, col, rowspan, colspan)
のように指定できます。 - レイアウト内のウィジェットを削除したいときは?
-
takeAt(index)
で取得し、.widget().deleteLater()
で削除してください。 - 複数のレイアウトを切り替えるには?
-
QStackedLayout
やQStackedWidget
を利用するのが便利です
まとめ
この記事では、PySide6のレイアウト管理クラスであるQHBoxLayout
、QVBoxLayout
、QGridLayout
の基本から、主要なプロパティ・メソッド、FAQまでを徹底解説しました。GUI設計においてレイアウト管理は重要なスキルです。
QLayoutの使いこなしは、PySideを用いたGUIアプリケーションの完成度を大きく左右します。ぜひ何度も手を動かして、柔軟なUI構成を実現できるようにしていきましょう。
次回は、「イベント処理とシグナル・スロットの応用テクニック」を解説します。
ボタンをクリックしたときの反応や、複数ウィジェットの連動動作を、PySideでどのように実現するのか。connect()
やラムダ式、イベントフィルタの活用など、実践的な内容を取り上げる予定です。お楽しみに!
コメント