PySide超入門【第17回|応用編】QLayout完全ガイド|QHBoxLayout・QVBoxLayout・QGridLayout

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

「PySideでウィジェットを並べるにはどうすればいいの?」「QHBoxLayoutQVBoxLayoutの違いがいまいち分からない…」そんな悩みはありませんか?

本記事では、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()
QHBoxLayoutQVBoxLayoutQGridLayout

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

Noメソッド / プロパティ説明
1addWidget(widget)ウィジェットをレイアウトに追加するlayout.addWidget(btn)
2addLayout(layout)他のレイアウトを入れ子で追加するlayout.addLayout(sub_layout)
3addSpacing(size)指定ピクセル分のスペースを追加するlayout.addSpacing(20)
4addStretch(stretch=1)伸縮可能な空間を追加するlayout.addStretch()
5setSpacing(pixels)ウィジェット間のスペースを設定するlayout.setSpacing(10)
6setContentsMargins(l, t, r, b)レイアウトの余白を設定するlayout.setContentsMargins(5, 10, 5, 10)
7setAlignment(widget, alignment)ウィジェットの配置位置を設定(Qt.Align*)layout.setAlignment(btn, Qt.AlignRight)
8itemAt(index)指定インデックスのアイテムを取得するlayout.itemAt(0).widget()
9count()レイアウト内のアイテム数を取得layout.count()
10takeAt(index)指定位置のアイテムを削除し、返すlayout.takeAt(0)
11insertWidget(index, widget)指定位置にウィジェットを挿入するlayout.insertWidget(1, btn)

各プロパティ・メソッド 詳細解説

【1】ウィジェットの追加

概要: ウィジェットをレイアウトに追加する。
メソッド: addWidget(widget)
使い方:

layout.addWidget(QPushButton("追加ボタン"))
QHBoxLayoutQVBoxLayoutQGridLayout

【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()で削除してください。

複数のレイアウトを切り替えるには?

QStackedLayoutQStackedWidgetを利用するのが便利です

まとめ

この記事では、PySide6のレイアウト管理クラスであるQHBoxLayoutQVBoxLayoutQGridLayoutの基本から、主要なプロパティ・メソッド、FAQまでを徹底解説しました。GUI設計においてレイアウト管理は重要なスキルです。
QLayoutの使いこなしは、PySideを用いたGUIアプリケーションの完成度を大きく左右します。ぜひ何度も手を動かして、柔軟なUI構成を実現できるようにしていきましょう。

次回は、「イベント処理とシグナル・スロットの応用テクニック」を解説します。
ボタンをクリックしたときの反応や、複数ウィジェットの連動動作を、PySideでどのように実現するのか。connect()やラムダ式、イベントフィルタの活用など、実践的な内容を取り上げる予定です。お楽しみに!

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

コメント

コメントする

目次