QGraphicsLayout Class
Die Klasse QGraphicsLayout stellt die Basisklasse für alle Layouts in der Grafikansicht dar. Mehr...
Kopfzeile: | #include <QGraphicsLayout> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Widgets) target_link_libraries(mytarget PRIVATE Qt6::Widgets) |
qmake: | QT += widgets |
Vererbt: | QGraphicsLayoutItem |
Vererbt von: | QGraphicsAnchorLayout, QGraphicsGridLayout, und 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) |
Reimplementierte ö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) |
Detaillierte Beschreibung
QGraphicsLayout ist eine abstrakte Klasse, die eine virtuelle API für die Anordnung von QGraphicsWidget Kindern und anderen QGraphicsLayoutItem Objekten für ein QGraphicsWidget definiert. QGraphicsWidget weist die Verantwortung einem QGraphicsLayout durch QGraphicsWidget::setLayout() zu. Wenn die Größe des Widgets geändert wird, ordnet das Layout automatisch die Kinder des Widgets an. QGraphicsLayout erbt QGraphicsLayoutItem, so dass es von jedem Layout verwaltet werden kann, einschließlich seiner eigenen Unterklassen.
Schreiben eines eigenen Layouts
Sie können QGraphicsLayout als Basis verwenden, um Ihr eigenes benutzerdefiniertes Layout zu schreiben (z.B. ein Flowlayout), aber es ist gebräuchlicher, stattdessen eine seiner Unterklassen zu verwenden - QGraphicsLinearLayout oder QGraphicsGridLayout. Bei der Erstellung eines benutzerdefinierten Layouts müssen mindestens die folgenden Funktionen reimplementiert werden:
Funktion | Beschreibung |
---|---|
QGraphicsLayoutItem::setGeometry() | Benachrichtigt Sie, wenn die Geometrie des Layouts festgelegt ist. Sie können die Geometrie in Ihrer eigenen Layoutklasse in einer Reimplementierung 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 zerstören. |
Weitere Einzelheiten zur Implementierung der einzelnen Funktionen finden Sie in der jeweiligen Funktionsdokumentation.
Jedes Layout definiert seine eigene API zum Anordnen von Widgets und Layoutelementen. Für ein Rasterlayout benötigen Sie beispielsweise einen Zeilen- und einen Spaltenindex mit optionalen Zeilen- und Spaltenabständen, Ausrichtungen, Abständen und mehr. Ein lineares Layout hingegen erfordert einen einzigen Zeilen- oder Spaltenindex, um seine Elemente zu positionieren. Bei einem Rasterlayout wirkt sich die Reihenfolge des Einfügens in keiner Weise auf das Layout aus, bei einem linearen Layout ist die Reihenfolge jedoch entscheidend. Wenn Sie Ihre eigene Layout-Unterklasse schreiben, können Sie die API wählen, die am besten zu Ihrem Layout passt.
QGraphicsLayout bietet die Komfortfunktion addChildLayoutItem(), um Layoutelemente zu einem benutzerdefinierten Layout hinzuzufügen. Die Funktion repariert die Grafikelemente automatisch, falls erforderlich.
Aktivieren des Layouts
Wenn sich die Geometrie des Layouts ändert, ordnet QGraphicsLayout sofort alle verwalteten Elemente neu an, indem es setGeometry() für jedes Element aufruft. Diese Neuanordnung wird als Aktivieren des Layouts bezeichnet.
QGraphicsLayout aktualisiert seine eigene Geometrie, damit sie mit der contentsRect() des von ihm verwalteten QGraphicsLayoutItem übereinstimmt. Daher ordnet es automatisch alle seine Elemente neu an, wenn die Größe des Widgets geändert wird. QGraphicsLayout speichert die Größen aller verwalteten Elemente im Cache, um einen zu häufigen Aufruf von setGeometry() zu vermeiden.
Hinweis: Ein QGraphicsLayout hat die gleiche Geometrie wie contentsRect() des Widgets (nicht des Layouts), dem es zugewiesen ist.
Implizites Aktivieren des Layouts
Das Layout kann auf zwei Arten implizit aktiviert werden: durch Aufruf von activate() oder durch Aufruf von invalidate(). Durch den Aufruf von activate() wird das Layout sofort aktiviert. Im Gegensatz dazu ist der Aufruf von invalidate() verzögert, da er ein LayoutRequest Ereignis an das verwaltete Widget sendet. Aufgrund der Ereigniskomprimierung wird activate() nur einmal aufgerufen, nachdem die Kontrolle zur Ereignisschleife zurückgekehrt ist. Dies wird als Invalidierung des Layouts bezeichnet. Durch die Invalidierung des Layouts werden auch alle zwischengespeicherten Informationen ungültig. Außerdem ist die Funktion invalidate() eine virtuelle Funktion. Sie können also Ihren eigenen Cache in einer Unterklasse von QGraphicsLayout ungültig machen, indem Sie diese Funktion neu implementieren.
Ereignisbehandlung
QGraphicsLayout hört auf Ereignisse für das Widget, das es verwaltet, durch den virtuellen widgetEvent() Eventhandler. Wenn das Layout einem Widget zugewiesen wird, werden alle Ereignisse, die an das Widget geliefert werden, zuerst von widgetEvent() verarbeitet. Dies ermöglicht es dem Layout, alle relevanten Zustandsänderungen des Widgets, wie z. B. Änderungen der Sichtbarkeit oder der Layoutrichtung, zu erkennen.
Umgang mit Rändern
Die Ränder eines QGraphicsLayouts können durch eine Neuimplementierung von setContentsMargins() und getContentsMargins() verändert werden.
Dokumentation der Mitgliedsfunktionen
QGraphicsLayout::QGraphicsLayout(QGraphicsLayoutItem *parent = nullptr)
Konstruiert 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 bei der Installation eines Layouts das alte Layout gelöscht wird).
[virtual noexcept]
QGraphicsLayout::~QGraphicsLayout()
Zerstört das Objekt QGraphicsLayout.
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() und dem anschließenden Aufruf von setGeometry() für alle Elemente nacheinander. Wenn sie aktiviert wird, passt das Layout seine Geometrie an die contentsRect() des Elternteils an. Das übergeordnete Element macht dann alle eigenen Layouts ungültig.
Wird diese Funktion nacheinander oder rekursiv aufgerufen, z. B. von einem der angeordneten Elemente als Reaktion auf eine Größenänderung, so bewirkt sie nichts.
Beachten Sie, dass es dem Layout freisteht, Geometrie-Caching zur Optimierung dieses Prozesses zu verwenden. Um einen solchen Cache zwangsweise zu deaktivieren, können Sie invalidate() aufrufen, bevor Sie activate() aufrufen.
Siehe auch invalidate().
[protected]
void QGraphicsLayout::addChildLayoutItem(QGraphicsLayoutItem *layoutItem)
Diese Funktion ist eine Komfortfunktion, die für benutzerdefinierte Layouts zur Verfügung gestellt wird. Sie durchläuft alle Elemente im Layout und repariert ihre Grafikelemente auf den nächstgelegenen QGraphicsWidget Vorfahren des Layouts.
Wenn sich layoutItem bereits in einem anderen Layout befindet, wird es aus diesem Layout entfernt.
Wenn benutzerdefinierte Layouts ein spezielles Verhalten wünschen, können sie diese 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 reimplementiert 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
Reimplements: QGraphicsLayoutItem::getContentsMargins(qreal *left, qreal *top, qreal *right, qreal *bottom) const.
[virtual]
void QGraphicsLayout::invalidate()
Löscht alle zwischengespeicherten Geometrie- und Größenhinweise 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. Wenn das Layout gerade aktiviert wird, bedeutet dies, dass es gerade dabei ist, seine Elemente neu anzuordnen (d. h., die Funktion activate() wurde aufgerufen und ist noch nicht zurückgekehrt).
Siehe auch activate() und invalidate().
[pure virtual]
QGraphicsLayoutItem *QGraphicsLayout::itemAt(int i) const
Diese rein virtuelle Funktion muss in einer Unterklasse von QGraphicsLayout reimplementiert werden, um einen Zeiger auf das Element mit dem Index i zurückzugeben. Die Neuimplementierung kann davon ausgehen, dass i gültig ist (d. h., dass sie den Wert von count() respektiert). Zusammen mit count() wird sie als Mittel zur Iteration über alle Elemente in einem Layout bereitgestellt.
Die Unterklasse kann frei entscheiden, wie die Elemente gespeichert werden sollen, und die visuelle Anordnung muss nicht durch diese Funktion widergespiegelt werden.
Siehe auch count() und removeAt().
[pure virtual]
void QGraphicsLayout::removeAt(int index)
Diese rein virtuelle Funktion muss in einer Unterklasse von QGraphicsLayout reimplementiert werden, um das Element unter index zu entfernen. Die Neuimplementierung kann davon ausgehen, dass index gültig ist (d. h. sie respektiert den Wert von count()).
Die Implementierung muss sicherstellen, dass parentLayoutItem() des entfernten Elements nicht auf dieses Layout verweist, da das Element als aus der Layouthierarchie entfernt betrachtet wird.
Wenn das Layout zwischen verschiedenen Anwendungen wiederverwendet werden soll, wird empfohlen, dass das Layout das Element löscht, aber das Graphics View Framework ist davon nicht abhängig.
Die Unterklasse kann frei entscheiden, wie sie die Elemente speichert.
Siehe auch itemAt() und count().
void QGraphicsLayout::setContentsMargins(qreal left, qreal top, qreal right, qreal bottom)
Setzt die Inhaltsränder auf left, top, right und bottom. Die Standard-Inhaltsränder für Toplevel-Layouts sind stilabhängig (durch Abfrage der PixelMetrik für QStyle::PM_LayoutLeftMargin, QStyle::PM_LayoutTopMargin, QStyle::PM_LayoutRightMargin und QStyle::PM_LayoutBottomMargin).
Für Sublayouts sind die Standardränder 0.
Eine Änderung der Inhaltsränder macht das Layout automatisch ungültig.
Siehe auch invalidate().
[override virtual]
void QGraphicsLayout::updateGeometry()
Reimplements: QGraphicsLayoutItem::updateGeometry().
[virtual]
void QGraphicsLayout::widgetEvent(QEvent *e)
Dieser virtuelle Ereignishandler empfängt alle Ereignisse für das verwaltete Widget. QGraphicsLayout verwendet diesen Ereignishandler, um auf layoutbezogene Ereignisse wie Geometrieänderungen, Layoutänderungen oder Änderungen der Layoutrichtung zu warten.
e ist ein Zeiger auf das Ereignis.
Sie können diesen Ereignishandler neu implementieren, um ähnliche Ereignisse für Ihr eigenes benutzerdefiniertes Layout zu verfolgen.
Siehe auch QGraphicsWidget::event() und QGraphicsItem::sceneEvent().
© 2025 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.