Auf dieser Seite

QGraphicsLayout Class

Die Klasse „QGraphicsLayout“ bildet die Basisklasse für alle Layouts in der Graphics View. Mehr...

Header: #include <QGraphicsLayout>
CMake: find_package(Qt6 REQUIRED COMPONENTS Widgets)
target_link_libraries(mytarget PRIVATE Qt6::Widgets)
qmake: QT += widgets
Erbt von: QGraphicsLayoutItem
Vererbt an:

QGraphicsAnchorLayout, „ QGraphicsGridLayout “ sowie QGraphicsLinearLayout

Öffentliche Funktionen

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)

Neu implementierte öffentliche Funktionen

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

Geschützte Funktionen

void addChildLayoutItem(QGraphicsLayoutItem *layoutItem)

Ausführliche Beschreibung

`QGraphicsLayout` ist eine abstrakte Klasse, die eine virtuelle API zum Anordnen von ` QGraphicsWidget `-Kindelementen und anderen ` QGraphicsLayoutItem `-Objekten für ein ` QGraphicsWidget` definiert. ` QGraphicsWidget ` überträgt die Verantwortung über ` QGraphicsWidget::setLayout()` an ein `QGraphicsLayout`. Wenn die Größe des Widgets geändert wird, ordnet das Layout die Kindelemente des Widgets automatisch an. QGraphicsLayout erbt von „ QGraphicsLayoutItem “, sodass es von jedem Layout verwaltet werden kann, einschließlich seiner eigenen Unterklassen.

Ein benutzerdefiniertes Layout erstellen

Sie können `QGraphicsLayout` als Grundlage verwenden, um ein eigenes Layout zu erstellen (z. B. ein `flowlayout`), jedoch ist es üblicher, stattdessen eine seiner Unterklassen zu verwenden – ` QGraphicsLinearLayout ` oder ` QGraphicsGridLayout`. Beim Erstellen eines benutzerdefinierten Layouts müssen mindestens die folgenden Funktionen neu implementiert werden:

FunktionBeschreibung
QGraphicsLayoutItem::setGeometry()Benachrichtigt Sie, wenn die Geometrie des Layouts festgelegt ist. Sie können die Geometrie in Ihrer eigenen Layout-Klasse in einer Neuimplementierung dieser Funktion speichern.
QGraphicsLayoutItem::sizeHint()Gibt die Größenhinweise des Layouts zurück.
QGraphicsLayout::count()Gibt die Anzahl der Elemente in Ihrem Layout zurück.
QGraphicsLayout::itemAt()Gibt einen Zeiger auf ein Element in Ihrem Layout zurück.
QGraphicsLayout::removeAt()Entfernt ein Element aus Ihrem Layout, ohne es zu löschen.

Weitere Informationen zur Implementierung der einzelnen Funktionen finden Sie in der jeweiligen Funktionsdokumentation.

Jedes Layout definiert seine eigene API zum Anordnen von Widgets und Layout-Elementen. Bei einem Rasterlayout benötigen Sie beispielsweise einen Zeilen- und einen Spaltenindex mit optionalen Zeilen- und Spaltenbereichen, Ausrichtung, Abständen und mehr. Ein lineares Layout erfordert hingegen nur einen einzigen Zeilen- oder Spaltenindex, um seine Elemente zu positionieren. Bei einem Rasterlayout hat die Reihenfolge der Einfügung keinerlei Einfluss auf das Layout, bei einem linearen Layout ist die Reihenfolge jedoch entscheidend. Wenn Sie eine eigene Layout-Unterklasse erstellen, können Sie frei wählen, welche API am besten zu Ihrem Layout passt.

QGraphicsLayout stellt die Komfortfunktion ` addChildLayoutItem()` zur Verfügung, um Layout-Elemente zu einem benutzerdefinierten Layout hinzuzufügen. Die Funktion ordnet Grafikelemente bei Bedarf automatisch einem neuen übergeordneten Element zu.

Aktivierung des Layouts

Wenn sich die Geometrie des Layouts ändert, ordnet QGraphicsLayout alle von ihm verwalteten Elemente sofort neu an, indem es für jedes Element setGeometry() aufruft. Diese Neuordnung wird als Aktivierung des Layouts bezeichnet.

QGraphicsLayout aktualisiert seine eigene Geometrie so, dass sie mit dem ` contentsRect()` des von ihm verwalteten ` QGraphicsLayoutItem ` übereinstimmt. Somit ordnet es alle seine Elemente automatisch neu an, wenn die Größe des Widgets geändert wird. QGraphicsLayout speichert die Größen aller von ihm verwalteten Elemente im Cache, um einen zu häufigen Aufruf von ` setGeometry()` zu vermeiden.

Hinweis: Ein `QGraphicsLayout` hat dieselbe Geometrie wie die ` contentsRect()` des Widgets (nicht des Layouts), dem es zugewiesen ist.

Implizite Aktivierung des Layouts

Das Layout kann auf zwei Arten implizit aktiviert werden: durch den Aufruf von ` activate()` oder durch den Aufruf von ` invalidate()`. Der Aufruf von ` activate()` aktiviert das Layout sofort. Im Gegensatz dazu wird der Aufruf von ` invalidate()` verzögert, da dabei ein ` LayoutRequest `-Ereignis an das verwaltete Widget gesendet wird. Aufgrund der Ereigniskompression wird ` activate()` erst einmal aufgerufen, nachdem die Kontrolle an die Ereignisschleife zurückgegeben wurde. Dies wird als „Invalidierung des Layouts“ bezeichnet. Durch die Invalidierung des Layouts werden auch alle zwischengespeicherten Informationen ungültig gemacht. Außerdem ist die Funktion ` invalidate()` eine virtuelle Funktion. Sie können also Ihren eigenen Cache in einer Unterklasse von `QGraphicsLayout` invalidieren, indem Sie diese Funktion neu implementieren.

Ereignisbehandlung

QGraphicsLayout überwacht Ereignisse für das von ihm verwaltete Widget über den virtuellen Ereignisbehandler ` widgetEvent()`. Wenn das Layout einem Widget zugewiesen wird, werden alle an das Widget übermittelten Ereignisse zunächst von ` widgetEvent()` verarbeitet. Dadurch kann das Layout alle relevanten Zustandsänderungen am Widget erkennen, wie z. B. Änderungen der Sichtbarkeit oder der Layoutrichtung.

Behandlung der Ränder

Die Ränder eines QGraphicsLayout können durch die Neuimplementierung von ` setContentsMargins()` und ` getContentsMargins()` geändert werden.

Dokumentation der Mitgliedsfunktionen

QGraphicsLayout::QGraphicsLayout(QGraphicsLayoutItem *parent = nullptr)

Erstellt ein QGraphicsLayout-Objekt.

parent wird an den Konstruktor von ` QGraphicsLayoutItem` übergeben, und das Argument `isLayout` von ` QGraphicsLayoutItem` wird auf `true` gesetzt.

Wenn „ parent “ ein „ QGraphicsWidget “ ist, wird das Layout auf diesem Widget installiert. (Beachten Sie, dass durch die Installation eines Layouts das zuvor installierte Layout gelöscht wird.)

[virtual noexcept] QGraphicsLayout::~QGraphicsLayout()

Löscht das „ QGraphicsLayout “-Objekt.

void QGraphicsLayout::activate()

Aktiviert das Layout, wodurch alle Elemente im Layout sofort neu angeordnet werden. Diese Funktion basiert auf dem Aufruf von ` count()` und ` itemAt()` sowie dem anschließenden sequenziellen Aufruf von ` setGeometry()` für alle Elemente. Bei der Aktivierung passt das Layout seine Geometrie an die vom übergeordneten Element mit ` contentsRect()` festgelegte Geometrie an. Das übergeordnete Element macht daraufhin sein eigenes Layout ungültig.

Wird diese Funktion nacheinander oder rekursiv aufgerufen, z. B. von einem der angeordneten Elemente als Reaktion auf eine Größenänderung, führt sie keine Aktion aus.

Beachten Sie, dass das Layout zur Optimierung dieses Vorgangs Geometrie-Caching verwenden kann. Um einen solchen Cache zwangsweise zu ungültig zu machen, können Sie vor dem Aufruf von `activate()` die Funktion ` invalidate()` aufrufen.

Siehe auch invalidate().

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

Diese Funktion ist eine Hilfsfunktion für benutzerdefinierte Layouts. Sie durchläuft alle Elemente im Layout und ordnet deren Grafikelemente dem nächstgelegenen „ QGraphicsWidget “-Vorfahren des Layouts zu.

Befindet sich „ layoutItem “ bereits in einem anderen Layout, wird es aus diesem Layout entfernt.

Wenn benutzerdefinierte Layouts ein spezielles Verhalten erfordern, können sie die Verwendung dieser Funktion ignorieren und ihr eigenes Verhalten implementieren.

Siehe auch ` graphicsItem()`.

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

Diese rein virtuelle Funktion muss in einer Unterklasse von „ QGraphicsLayout “ neu implementiert werden, um die Anzahl der Elemente im Layout zurückzugeben.

Die Unterklasse kann frei entscheiden, wie die Elemente gespeichert werden sollen.

Siehe auch „ itemAt()“ und „ removeAt()“.

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

Implementiert: ` QGraphicsLayoutItem::getContentsMargins(qreal *left, qreal *top, qreal *right, qreal *bottom) const`.

[virtual] void QGraphicsLayout::invalidate()

Löscht alle zwischengespeicherten Geometrie- und Größenhinweisinformationen im Layout und sendet ein „ LayoutRequest “-Ereignis an das verwaltete übergeordnete Element „ QGraphicsLayoutItem “.

Siehe auch activate() und setGeometry().

bool QGraphicsLayout::isActivated() const

Gibt „ true “ zurück, wenn das Layout gerade aktiviert wird; andernfalls wird „ false “ zurückgegeben. Wird das Layout gerade aktiviert, bedeutet dies, dass es gerade dabei ist, seine Elemente neu anzuordnen (d. h., die Funktion „ activate()“ wurde aufgerufen und hat noch keinen Rückgabewert geliefert).

Siehe auch activate() und invalidate().

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

Diese rein virtuelle Funktion muss in einer Unterklasse von ` QGraphicsLayout ` neu implementiert werden, um einen Zeiger auf das Element am Index ` i` zurückzugeben. Die Neuimplementierung kann davon ausgehen, dass ` i ` gültig ist (d. h., sie berücksichtigt den Wert von ` count()`). Zusammen mit ` count()` dient sie dazu, alle Elemente in einem Layout zu durchlaufen.

Die Unterklasse kann frei entscheiden, wie die Elemente gespeichert werden, und die visuelle Anordnung muss sich nicht in dieser Funktion widerspiegeln.

Siehe auch „ count “ () und „ removeAt “ ().

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

Diese rein virtuelle Funktion muss in einer Unterklasse von ` QGraphicsLayout ` neu implementiert werden, um das Element unter ` index` zu entfernen. Die Neuimplementierung kann davon ausgehen, dass ` index ` gültig ist (d. h., sie berücksichtigt den Wert von ` count()`).

Die Implementierung muss sicherstellen, dass die Methode ` parentLayoutItem()` des entfernten Elements nicht auf dieses Layout verweist, da das Element als aus der Layout-Hierarchie entfernt gilt.

Soll das Layout anwendungsübergreifend wiederverwendet werden, empfehlen wir, dass das Layout das Element löscht; das Grafik-View-Framework ist jedoch nicht darauf angewiesen.

Die Unterklasse kann frei entscheiden, wie die Elemente gespeichert werden.

Siehe auch ` itemAt()` und ` count()`.

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

Legt die Inhaltsränder auf „ left “, „ top “, „ right “ und „ bottom “ fest. Die Standard-Inhaltsränder für Layouts der obersten Ebene sind stilabhängig (durch Abfrage der „pixelMetric“ für „ QStyle::PM_LayoutLeftMargin “, „ QStyle::PM_LayoutTopMargin “, „ QStyle::PM_LayoutRightMargin “ und „ QStyle::PM_LayoutBottomMargin “).

Für Unterlayouts betragen die Standardränder 0.

Das Ändern der Inhaltsränder macht das Layout automatisch ungültig.

Siehe auch ` invalidate()`.

[override virtual] void QGraphicsLayout::updateGeometry()

Implementiert: ` QGraphicsLayoutItem::updateGeometry()`.

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

Dieser virtuelle Ereignisbehandler empfängt alle Ereignisse für das verwaltete Widget. „ QGraphicsLayout “ nutzt diesen Ereignisbehandler, um auf layoutbezogene Ereignisse wie Geometrieänderungen, Layoutänderungen oder Änderungen der Layoutrichtung zu achten.

e ist ein Zeiger auf das Ereignis.

Sie können diesen Ereignis-Handler neu implementieren, um ähnliche Ereignisse für Ihr eigenes benutzerdefiniertes Layout zu verfolgen.

Siehe auch „ QGraphicsWidget::event()“ und „ 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.