このページでは

QGraphicsLayout Class

QGraphicsLayout クラスは、Graphics View のすべてのレイアウトの基底クラスを提供します。詳細...

ヘッダー: #include <QGraphicsLayout>
CMake: find_package(Qt6 REQUIRED COMPONENTS Widgets)
target_link_libraries(mytarget PRIVATE Qt6::Widgets)
qmake: QT += widgets
継承元: QGraphicsLayoutItem
継承元:

QGraphicsAnchorLayout、QGraphicsGridLayout 、およびQGraphicsLinearLayout

パブリック関数

QGraphicsLayout(QGraphicsLayoutItem *parent = nullptr)
virtual ~QGraphicsLayout()
void activate()
virtual int count() const = 0
virtual void invalidate()
bool isActivated() const
virtual QGraphicsLayoutItem *itemAt(int i) const = 0
virtual void removeAt(int index) = 0
void setContentsMargins(qreal left, qreal top, qreal right, qreal bottom)
virtual void widgetEvent(QEvent *e)

再実装されたパブリック関数

virtual void getContentsMargins(qreal *left, qreal *top, qreal *right, qreal *bottom) const override
virtual void updateGeometry() override

Protected関数

void addChildLayoutItem(QGraphicsLayoutItem *layoutItem)

詳細な説明

QGraphicsLayout は、QGraphicsWidget に対して、QGraphicsWidget の子ウィジェットやその他のQGraphicsLayoutItem オブジェクトを配置するための仮想 API を定義する抽象クラスです。QGraphicsWidget は、QGraphicsWidget::setLayout() を通じて、QGraphicsLayout に責任を割り当てます。ウィジェットのサイズが変更されると、レイアウトは自動的にウィジェットの子ウィジェットを配置します。 QGraphicsLayoutはQGraphicsLayoutItem を継承しているため、自身のサブクラスを含め、あらゆるレイアウトによって管理することができます。

カスタムレイアウトの作成

QGraphicsLayoutをベースにして独自のカスタムレイアウト(例:フローレイアウト)を作成することも可能ですが、代わりにそのサブクラスのいずれか(QGraphicsLinearLayout やQGraphicsGridLayout など)を使用するのが一般的です。カスタムレイアウトを作成する際には、最低限以下の関数を再実装する必要があります:

関数説明
QGraphicsLayoutItem::setGeometry()レイアウトのジオメトリが設定された際に通知します。この関数を再実装することで、独自のレイアウトクラスにジオメトリを保存することができます。
QGraphicsLayoutItem::sizeHint()レイアウトのサイズヒントを返します。
QGraphicsLayout::count()レイアウト内のアイテム数を返します。
QGraphicsLayout::itemAt()レイアウト内のアイテムへのポインタを返します。
QGraphicsLayout::removeAt()レイアウトからアイテムを削除しますが、アイテム自体は破棄されません。

各関数の実装方法の詳細については、各関数のドキュメントを参照してください。

各レイアウトは、ウィジェットやレイアウト項目を配置するための独自の API を定義しています。たとえば、グリッドレイアウトでは、行インデックスと列インデックスに加え、オプションで行や列のスパン、配置、間隔などを指定する必要があります。 一方、リニアレイアウトでは、アイテムを配置するために単一の行または列のインデックスが必要です。グリッドレイアウトの場合、挿入順序はレイアウトにまったく影響しませんが、リニアレイアウトでは順序が不可欠です。独自のレイアウトサブクラスを作成する際は、そのレイアウトに最適な API を自由に選択できます。

QGraphicsLayoutは、カスタムレイアウトにレイアウト項目を追加するための利便性関数addChildLayoutItem()を提供しています。この関数は、必要に応じてグラフィック項目の親を自動的に再設定します。

レイアウトのアクティブ化

レイアウトのジオメトリが変更されると、QGraphicsLayoutは各アイテムに対してsetGeometry()を呼び出すことで、管理下にあるすべてのアイテムを直ちに再配置します。この再配置は、レイアウトのアクティブ化と呼ばれます。

QGraphicsLayoutは、自身が管理しているQGraphicsLayoutItem のcontentsRect()と一致するように、自身のジオメトリを更新します。したがって、ウィジェットのサイズが変更されると、すべてのアイテムが自動的に再配置されます。QGraphicsLayoutは、setGeometry()が頻繁に呼び出されるのを防ぐため、管理しているすべてのアイテムのサイズをキャッシュします。

注: QGraphicsLayoutは 、割り当てられているウィジェット(レイアウト自体ではなく)のcontentsRect()と同じジオメトリを持ちます。

レイアウトの暗黙的な有効化

レイアウトは、activate() を呼び出すか、invalidate() を呼び出すかの 2 つの方法のいずれかを使用して、暗黙的に有効化できます。activate() を呼び出すと、レイアウトは即座に有効化されます。対照的に、invalidate() の呼び出しは、管理対象のウィジェットに `LayoutRequest ` イベントを送信するため、遅延します。イベント圧縮により、activate() は、制御がイベントループに戻った後に 1 回だけ呼び出されます。 これは「レイアウトの無効化」と呼ばれます。レイアウトを無効化すると、キャッシュされた情報もすべて無効になります。また、invalidate() 関数は仮想関数です。したがって、QGraphicsLayout のサブクラスでこの関数を再実装することで、独自のキャッシュを無効化することができます。

イベント処理

QGraphicsLayoutは、仮想のwidgetEvent()イベントハンドラを通じて、管理するウィジェットのイベントを監視します。レイアウトがウィジェットに割り当てられると、そのウィジェットに配信されるすべてのイベントは、まずwidgetEvent()によって処理されます。これにより、レイアウトは、可視性の変更やレイアウト方向の変更など、ウィジェット上の関連する状態変化を把握できるようになります。

マージンの処理

QGraphicsLayoutのマージンは、setContentsMargins()およびgetContentsMargins()を再実装することで変更できます。

メンバ関数のドキュメント

QGraphicsLayout::QGraphicsLayout(QGraphicsLayoutItem *parent = nullptr)

QGraphicsLayout オブジェクトを生成します。

parent QGraphicsLayoutItem のコンストラクタに渡され、 のisLayoutQGraphicsLayoutItem引数がtrueに設定されます。

parent がQGraphicsWidget の場合、レイアウトはそのウィジェットにインストールされます。(レイアウトをインストールすると、以前にインストールされていたレイアウトは削除されることに注意してください。)

[virtual noexcept] QGraphicsLayout::~QGraphicsLayout()

QGraphicsLayout オブジェクトを破棄します。

void QGraphicsLayout::activate()

レイアウトをアクティブにし、レイアウト内のすべてのアイテムを直ちに再配置します。この関数は、count() およびitemAt() を呼び出した後、すべてのアイテムに対して順次setGeometry() を呼び出す仕組みに基づいています。アクティブ化されると、レイアウトはそのジオメトリを親のcontentsRect() に合わせるように調整します。その後、親は自身のレイアウトをすべて無効化します。

例えば、配置された項目のいずれかがサイズ変更に応答して、この関数を連続的または再帰的に呼び出した場合、この関数は何も実行しません。

なお、レイアウトは、このプロセスを最適化するためにジオメトリのキャッシュを使用しても構いません。そのようなキャッシュを強制的に無効化するには、activate()を呼び出す前にinvalidate()を呼び出すことができます。

invalidate()も参照してください 。

[protected] void QGraphicsLayout::addChildLayoutItem(QGraphicsLayoutItem *layoutItem)

この関数は、カスタムレイアウト向けに提供されている便利な関数であり、レイアウト内のすべての項目を順に処理し、それらのグラフィック項目を、レイアウトの最も近いQGraphicsWidget の親要素に再配置します。

layoutItem がすでに別のレイアウトに含まれている場合、そのレイアウトから削除されます。

カスタムレイアウトで特別な動作が必要な場合は、この関数の使用を無視して、独自の動作を実装することができます。

graphicsItem()も参照してください 。

[pure virtual] int QGraphicsLayout::count() const

この純粋仮想関数は、レイアウト内のアイテム数を返すために、QGraphicsLayout のサブクラスで再実装する必要があります。

アイテムの保存方法については、サブクラスが自由に決定できます。

itemAt() およびremoveAt()も参照してください 。

[override virtual] void QGraphicsLayout::getContentsMargins(qreal *left, qreal *top, qreal *right, qreal *bottom) const

QGraphicsLayoutItem::getContentsMargins (qreal *left, qreal *top, qreal *right, qreal *bottom)const を再実装します。

[virtual] void QGraphicsLayout::invalidate()

レイアウト内のキャッシュされたジオメトリおよびサイズヒント情報をすべてクリアし、マネージド親QGraphicsLayoutItem に対してLayoutRequest イベントを送信します。

activate() およびsetGeometry()も参照してください 。

bool QGraphicsLayout::isActivated() const

レイアウトが現在アクティブ化されている場合は `true ` を返し、そうでない場合は `false` を返します。レイアウトがアクティブ化されている場合、それは現在、そのアイテムの再配置が行われている最中であることを意味します(つまり、activate() 関数が呼び出されており、まだ戻り値が返されていない状態です)。

activate() およびinvalidate()も参照してください 。

[pure virtual] QGraphicsLayoutItem *QGraphicsLayout::itemAt(int i) const

この純粋仮想関数は、QGraphicsLayout のサブクラスにおいて、インデックスi にあるアイテムへのポインタを返すように再実装されなければなりません。再実装では、i が有効である(すなわち、count()の値を尊重している)と仮定してもかまいません。count()と併せて、レイアウト内のすべてのアイテムを反復処理するための手段として提供されています。

サブクラスは項目の保存方法を自由に決定でき、視覚的な配置をこの関数を通じて反映させる必要はありません。

count() およびremoveAt()も参照してください 。

[pure virtual] void QGraphicsLayout::removeAt(int index)

この純粋仮想関数は、`QGraphicsLayout ` のサブクラスにおいて、`index` にあるアイテムを削除するために再実装する必要があります。再実装では、`index ` が有効である(すなわち、`count()` の値を尊重している)と仮定してもかまいません。

そのアイテムはレイアウト階層から削除されたものとみなされるため、実装では、削除されたアイテムの `parentLayoutItem()` がこのレイアウトを指さないようにする必要があります。

レイアウトをアプリケーション間で再利用する場合は、レイアウトがアイテムを削除することを推奨しますが、グラフィックスビューフレームワークはこれに依存しません。

サブクラスは、アイテムの保存方法を自由に決定できます。

itemAt() およびcount()も参照してください 。

void QGraphicsLayout::setContentsMargins(qreal left, qreal top, qreal right, qreal bottom)

コンテンツの余白を、left 、top 、right 、bottom に設定します。最上位レイアウトのデフォルトのコンテンツ余白は、スタイルによって異なります(pixelMetric に対して、QStyle::PM_LayoutLeftMargin 、QStyle::PM_LayoutTopMargin 、QStyle::PM_LayoutRightMargin 、QStyle::PM_LayoutBottomMargin を問い合わせることで確認できます)。

サブレイアウトの場合、デフォルトのマージンは 0 です。

コンテンツのマージンを変更すると、レイアウトは自動的に無効になります。

invalidate()も参照してください 。

[override virtual] void QGraphicsLayout::updateGeometry()

QGraphicsLayoutItem::updateGeometry() を再実装します。

[virtual] void QGraphicsLayout::widgetEvent(QEvent *e)

この仮想イベントハンドラは、管理対象のウィジェットに関するすべてのイベントを受け取ります。QGraphicsLayout は、このイベントハンドラを使用して、ジオメトリの変更、レイアウトの変更、レイアウト方向の変更など、レイアウトに関連するイベントを監視します。

e はイベントへのポインタです。

このイベントハンドラを再実装して、独自のカスタムレイアウトの同様のイベントを追跡することができます。

QGraphicsWidget::event() およびQGraphicsItem::sceneEvent()も参照してください 。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.