このチュートリアルは、柔軟で整理されたユーザーインターフェースを作成するためのPyQt5の強力なQGridLayout
の使い方を包括的に解説します。基本事項、セルの結合やウィジェットの伸縮制御といった高度なテクニック、そして理解を深めるための実践的な例を取り上げます。
目次
1. QGridLayoutの基本的な使い方
QGridLayout
は、ウィジェットをグリッド状の行と列に配置します。各ウィジェットはデフォルトで1つのセルを占有します。簡単な例から始めましょう。
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QGridLayout
app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle("PyQt5 Grid Layout Example")
layout = QGridLayout()
button1 = QPushButton("Button 1")
button2 = QPushButton("Button 2")
button3 = QPushButton("Button 3")
button4 = QPushButton("Button 4")
layout.addWidget(button1, 0, 0) # 0行0列
layout.addWidget(button2, 0, 1) # 0行1列
layout.addWidget(button3, 1, 0) # 1行0列
layout.addWidget(button4, 1, 1) # 1行1列
window.setLayout(layout)
window.show()
sys.exit(app.exec_())
これは、2×2のボタングリッドを作成します。addWidget(widget, row, column)
は、指定された行と列(0から始まるインデックス)にウィジェットを追加します。
2. 複数のセルにまたがるウィジェット
ウィジェットを複数の行または列にまたがらせるには、addWidget(widget, row, column, rowspan, colspan)
を使用します。rowspan
とcolspan
は、ウィジェットが占有する行数と列数を定義します。
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QGridLayout, QLabel
app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle("PyQt5 Grid Layout Span Example")
layout = QGridLayout()
label = QLabel("This label spans two columns")
button1 = QPushButton("Button 1")
button2 = QPushButton("Button 2")
layout.addWidget(label, 0, 0, 1, 2) # 2列にまたがる
layout.addWidget(button1, 1, 0)
layout.addWidget(button2, 1, 1)
window.setLayout(layout)
window.show()
sys.exit(app.exec_())
ここでは、ラベルが2列にまたがっています。
3. ウィジェットの伸縮制御
デフォルトでは、ウィジェットは最小サイズに設定されます。ウィジェットが利用可能なスペースをどのように拡張して埋めるかを制御するには、setColumnStretch(column, stretch)
とsetRowStretch(row, stretch)
を使用します。伸縮係数が大きいほど、ウィジェットは利用可能なスペースの比例的に大きな部分を占めます。
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QGridLayout
app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle("PyQt5 Grid Layout Stretch Example")
layout = QGridLayout()
button1 = QPushButton("Button 1")
button2 = QPushButton("Button 2")
layout.addWidget(button1, 0, 0)
layout.addWidget(button2, 0, 1)
layout.setColumnStretch(1, 2) # 1列目は0列目の2倍伸縮する
window.setLayout(layout)
window.show()
sys.exit(app.exec_())
button2
は、button1
の水平方向のスペースの2倍になります。
4. 高度なテクニックと考慮事項
より複雑なレイアウトの場合は、以下を検討してください。
addLayout()
: ネストされた構造のために、他のレイアウトをQGridLayout
内に埋め込みます。- 配置:
setAlignment()
を使用して、セル内のウィジェットの配置を制御します。 - 間隔:
setVerticalSpacing()
とsetHorizontalSpacing()
を使用して、行と列の間隔を調整します。 - マージン:
setContentsMargins()
を使用して、グリッド全体の周囲のマージンを制御します。
これらのテクニックを習得することで、洗練され、高度に適応可能なPyQt5インターフェースを作成できます。