Auf dieser Seite

QGraphicsProxyWidget Class

Die Klasse „QGraphicsProxyWidget“ stellt eine Proxy-Ebene bereit, um ein „ QWidget “ in ein „ QGraphicsScene “ einzubetten. Mehr...

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

Öffentliche Typen

enum { Type }

Öffentliche Funktionen

QGraphicsProxyWidget(QGraphicsItem *parent = nullptr, Qt::WindowFlags wFlags = Qt::WindowFlags())
virtual ~QGraphicsProxyWidget()
QGraphicsProxyWidget *createProxyForChildWidget(QWidget *child)
void setWidget(QWidget *widget)
QRectF subWidgetRect(const QWidget *widget) const
QWidget *widget() const

Neu implementierte öffentliche Funktionen

virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override
virtual void setGeometry(const QRectF &rect) override
virtual int type() const override

Neu implementierte geschützte Funktionen

virtual void contextMenuEvent(QGraphicsSceneContextMenuEvent *event) override
virtual void dragEnterEvent(QGraphicsSceneDragDropEvent *event) override
virtual void dragLeaveEvent(QGraphicsSceneDragDropEvent *event) override
virtual void dragMoveEvent(QGraphicsSceneDragDropEvent *event) override
virtual void dropEvent(QGraphicsSceneDragDropEvent *event) override
virtual bool event(QEvent *event) override
virtual bool eventFilter(QObject *object, QEvent *event) override
virtual void focusInEvent(QFocusEvent *event) override
virtual bool focusNextPrevChild(bool next) override
virtual void focusOutEvent(QFocusEvent *event) override
virtual void grabMouseEvent(QEvent *event) override
virtual void hideEvent(QHideEvent *event) override
virtual void hoverEnterEvent(QGraphicsSceneHoverEvent *event) override
virtual void hoverLeaveEvent(QGraphicsSceneHoverEvent *event) override
virtual void hoverMoveEvent(QGraphicsSceneHoverEvent *event) override
virtual void inputMethodEvent(QInputMethodEvent *event) override
virtual QVariant inputMethodQuery(Qt::InputMethodQuery query) const override
virtual QVariant itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value) override
virtual void keyPressEvent(QKeyEvent *event) override
virtual void keyReleaseEvent(QKeyEvent *event) override
virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) override
virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override
virtual void mousePressEvent(QGraphicsSceneMouseEvent *event) override
virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override
virtual void resizeEvent(QGraphicsSceneResizeEvent *event) override
virtual void showEvent(QShowEvent *event) override
virtual QSizeF sizeHint(Qt::SizeHint which, const QSizeF &constraint = QSizeF()) const override
virtual void ungrabMouseEvent(QEvent *event) override
virtual void wheelEvent(QGraphicsSceneWheelEvent *event) override

Geschützte Slots

QGraphicsProxyWidget *newProxyWidget(const QWidget *child)

Ausführliche Beschreibung

QGraphicsProxyWidget bettet Widgets auf Basis von „ QWidget “ – beispielsweise ein „ QPushButton “, „ QFontComboBox “ oder sogar „ QFileDialog “ – in „ QGraphicsScene “ ein. Es leitet Ereignisse zwischen den beiden Objekten weiter und wandelt die auf Ganzzahlen basierende Geometrie von „ QWidget “ in die auf „qreal“ basierende Geometrie von „ QGraphicsWidget “ um. QGraphicsProxyWidget unterstützt alle Kernfunktionen von „ QWidget “, einschließlich Tab-Fokus, Tastatureingabe, Drag & Drop und Popups. Sie können auch komplexe Widgets einbetten, z. B. Widgets mit Unterwidgets.

Beispiel:

int main(int argc, char **argv)
{
    QApplication app(argc, argv);

    QTabWidget *tabWidget = new QTabWidget;

    QGraphicsScene scene;
    QGraphicsProxyWidget *proxy = scene.addWidget(tabWidget);

    QGraphicsView view(&scene);
    view.show();

    return app.exec();
}

QGraphicsProxyWidget sorgt dafür, dass Popup-Kinder eingebetteter Widgets automatisch eingebettet werden, indem für jedes Popup ein untergeordnetes Proxy-Widget erstellt wird. Das bedeutet: Wenn ein eingebettetes „ QComboBox “ seine Popup-Liste anzeigt, wird automatisch ein neues QGraphicsProxyWidget erstellt, das das Popup einbettet und korrekt positioniert. Dies funktioniert nur, wenn das Popup-Fenster ein untergeordnetes Element des eingebetteten Widgets ist (beispielsweise erfordert QToolButton::setMenu() die Instanz „ QMenu “ als untergeordnetes Element von QToolButton).

Einbetten eines Widgets mit QGraphicsProxyWidget

Es gibt zwei Möglichkeiten, ein Widget mithilfe von `QGraphicsProxyWidget` einzubetten. Die gängigste Methode besteht darin, einen Widget-Zeiger zusammen mit allen relevanten ` Qt::WindowFlags` an ` QGraphicsScene::addWidget()` zu übergeben. Diese Funktion gibt einen Zeiger auf ein `QGraphicsProxyWidget` zurück. Sie können dann wählen, ob Sie entweder das Proxy-Widget oder das eingebettete Widget selbst neu zuordnen oder positionieren möchten.

Im folgenden Codeausschnitt betten wir beispielsweise eine Gruppenbox in das Proxy ein:

QGroupBox *groupBox = new QGroupBox("Contact Details");
QLabel *numberLabel = new QLabel("Telephone number");
QLineEdit *numberEdit = new QLineEdit;

QFormLayout *layout = new QFormLayout(groupBox);
layout->addRow(numberLabel, numberEdit);

QGraphicsScene scene;
QGraphicsProxyWidget *proxy = scene.addWidget(groupBox);

QGraphicsView view(&scene);
view.show();

Die folgende Abbildung zeigt die Ausgabe, in der der Rand („margin“) und der Rechteckbereich („rect“) des Inhalts gekennzeichnet sind.

Proxy-Widget und sein eingebettetes Widget mit ihren Positionen

Alternativ können Sie zunächst ein neues `QGraphicsProxyWidget`-Element erstellen und anschließend ` setWidget()` aufrufen, um später ein ` QWidget ` einzubetten. Die Funktion ` widget()` gibt einen Zeiger auf das eingebettete Widget zurück. `QGraphicsProxyWidget` teilt sich die Eigentumsrechte mit ` QWidget`; wenn also eines der beiden Widgets zerstört wird, wird das andere Widget automatisch ebenfalls zerstört.

Synchronisierung von Widget-Zuständen

QGraphicsProxyWidget hält seinen Zustand mit dem eingebetteten Widget synchron. Ist der Proxy beispielsweise ausgeblendet oder deaktiviert, wird das eingebettete Widget ebenfalls ausgeblendet oder deaktiviert und umgekehrt. Wenn das Widget durch den Aufruf von `addWidget()` eingebettet wird, kopiert `QGraphicsProxyWidget` den Zustand vom Widget in den Proxy, und danach bleiben die beiden, soweit möglich, synchronisiert. Standardmäßig sind sowohl das Widget als auch der Proxy sichtbar, wenn Sie ein Widget in einen Proxy einbetten, da ein ` QGraphicsWidget ` bei seiner Erstellung sichtbar ist (Sie müssen ` show()` nicht aufrufen). Wenn Sie das eingebettete Widget explizit ausblenden, wird auch der Proxy unsichtbar.

Beispiel:

QGraphicsScene scene;

QLineEdit *edit = new QLineEdit;
QGraphicsProxyWidget *proxy = scene.addWidget(edit);

edit->isVisible();  // returns true
proxy->isVisible(); // also returns true

edit->hide();

edit->isVisible();  // returns false
proxy->isVisible(); // also returns false

QGraphicsProxyWidget gewährleistet die Symmetrie für die folgenden Zustände:

QWidget ZustandZustand von QGraphicsProxyWidgetAnmerkungen
QWidget::enabledQGraphicsProxyWidget::enabled
QWidget::visibleQGraphicsProxyWidget::visibleDer explizite Zustand ist ebenfalls symmetrisch.
QWidget::geometryQGraphicsProxyWidget::geometryDie Geometrie ist nur dann garantiert symmetrisch, solange das eingebettete Widget sichtbar ist.
QWidget::layoutDirectionQGraphicsProxyWidget::layoutDirection
QWidget::styleQGraphicsProxyWidget::style
QWidget::paletteQGraphicsProxyWidget::palette
QWidget::fontQGraphicsProxyWidget::font
QWidget::cursorQGraphicsProxyWidget::cursorDas eingebettete Widget überschreibt den Cursor des Proxy-Widgets. Der Proxy-Cursor ändert sich je nachdem, welches eingebettete Unter-Widget sich gerade unter dem Mauszeiger befindet.
QWidget::sizeHint()QGraphicsProxyWidget::sizeHint()Alle Funktionen zur Größenangabe des eingebetteten Widgets werden vom Proxy weitergeleitet.
QWidget::getContentsMargins()QGraphicsProxyWidget::getContentsMargins()Wird einmalig durch ` setWidget()` aktualisiert.
QWidget::windowTitleQGraphicsProxyWidget::windowTitleWird einmal von ` setWidget()` aktualisiert.

Hinweis: „ QGraphicsScene “ hält das eingebettete Widget in einem speziellen Zustand, der verhindert, dass es andere Widgets (sowohl eingebettete als auch nicht eingebettete) stört, solange das Widget eingebettet ist. In diesem Zustand kann sich das Verhalten des Widgets geringfügig von dem unterscheiden, das es aufweist, wenn es nicht eingebettet ist.

Warnung: Diese Klasse dient der Vereinfachung bei der Verknüpfung von QWidgets und QGraphicsItems und sollte nicht für Szenarien mit hohen Leistungsanforderungen verwendet werden. Insbesondere funktioniert das Einbetten von Widgets in eine Szene, die anschließend über ein ` QGraphicsView ` mit einem OpenGL-Viewport angezeigt wird, nicht bei allen Kombinationen.

Siehe auch ` QGraphicsScene::addWidget()` und ` QGraphicsWidget`.

Dokumentation zum Mitgliedstyp

[anonymous] enum

Der von der virtuellen Funktion ` type()` zurückgegebene Wert.

KonstanteWertBeschreibung
QGraphicsProxyWidget::Type12Ein Grafik-Proxy-Widget

Dokumentation der Member-Funktionen

QGraphicsProxyWidget::QGraphicsProxyWidget(QGraphicsItem *parent = nullptr, Qt::WindowFlags wFlags = Qt::WindowFlags())

Erstellt ein neues QGraphicsProxy-Widget. „ parent “ und „ wFlags “ werden an den Konstruktor von „ QGraphicsItem “ übergeben.

[virtual noexcept] QGraphicsProxyWidget::~QGraphicsProxyWidget()

Löscht das Proxy-Widget und alle darin eingebetteten Widgets.

[override virtual protected] void QGraphicsProxyWidget::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)

Implementiert: ` QGraphicsItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)`.

QGraphicsProxyWidget *QGraphicsProxyWidget::createProxyForChildWidget(QWidget *child)

Erstellt ein Proxy-Widget für die angegebene „ child “ des in diesem Proxy enthaltenen Widgets.

Diese Funktion ermöglicht es, Proxys für Widgets zu erhalten, die nicht auf oberster Ebene liegen. So können Sie beispielsweise ein Dialogfeld einbetten und anschließend nur eines seiner Widgets transformieren.

Wenn das Widget bereits eingebettet ist, wird das vorhandene Proxy-Widget zurückgegeben.

Siehe auch „ newProxyWidget()“ und „ QGraphicsScene::addWidget()“.

[override virtual protected] void QGraphicsProxyWidget::dragEnterEvent(QGraphicsSceneDragDropEvent *event)

Umsetzt: ` QGraphicsItem::dragEnterEvent(QGraphicsSceneDragDropEvent *event)`.

[override virtual protected] void QGraphicsProxyWidget::dragLeaveEvent(QGraphicsSceneDragDropEvent *event)

Umsetzt: ` QGraphicsItem::dragLeaveEvent(QGraphicsSceneDragDropEvent *event)`.

[override virtual protected] void QGraphicsProxyWidget::dragMoveEvent(QGraphicsSceneDragDropEvent *event)

Implementiert: ` QGraphicsItem::dragMoveEvent(QGraphicsSceneDragDropEvent *event)`.

[override virtual protected] void QGraphicsProxyWidget::dropEvent(QGraphicsSceneDragDropEvent *event)

Implementiert: ` QGraphicsItem::dropEvent(QGraphicsSceneDragDropEvent *event)`.

[override virtual protected] bool QGraphicsProxyWidget::event(QEvent *event)

Umsetzt: ` QGraphicsWidget::event(QEvent *event)`.

[override virtual protected] bool QGraphicsProxyWidget::eventFilter(QObject *object, QEvent *event)

Implementiert neu: ` QObject::eventFilter` (`QObject *watched, QEvent *event`).

[override virtual protected] void QGraphicsProxyWidget::focusInEvent(QFocusEvent *event)

Implementiert: ` QGraphicsWidget::focusInEvent(QFocusEvent *event)`.

[override virtual protected] bool QGraphicsProxyWidget::focusNextPrevChild(bool next)

Implementiert: ` QGraphicsWidget::focusNextPrevChild` (bool next).

[override virtual protected] void QGraphicsProxyWidget::focusOutEvent(QFocusEvent *event)

Implementiert: ` QGraphicsWidget::focusOutEvent(QFocusEvent *event)`.

[override virtual protected] void QGraphicsProxyWidget::grabMouseEvent(QEvent *event)

Umsetzt: ` QGraphicsWidget::grabMouseEvent(QEvent *event)`.

[override virtual protected] void QGraphicsProxyWidget::hideEvent(QHideEvent *event)

Implementiert: ` QGraphicsWidget::hideEvent(QHideEvent *event)`.

[override virtual protected] void QGraphicsProxyWidget::hoverEnterEvent(QGraphicsSceneHoverEvent *event)

Umsetzt: ` QGraphicsItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event)`.

[override virtual protected] void QGraphicsProxyWidget::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)

Implementiert: ` QGraphicsWidget::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)`.

[override virtual protected] void QGraphicsProxyWidget::hoverMoveEvent(QGraphicsSceneHoverEvent *event)

Umsetzt: ` QGraphicsWidget::hoverMoveEvent(QGraphicsSceneHoverEvent *event)`.

[override virtual protected] void QGraphicsProxyWidget::inputMethodEvent(QInputMethodEvent *event)

Umsetzt: ` QGraphicsItem::inputMethodEvent` (`QInputMethodEvent *event`).

[override virtual protected] QVariant QGraphicsProxyWidget::inputMethodQuery(Qt::InputMethodQuery query) const

Implementiert neu: ` QGraphicsItem::inputMethodQuery` (Qt::InputMethodQuery query) const.

[override virtual protected] QVariant QGraphicsProxyWidget::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value)

Implementiert: ` QGraphicsWidget::itemChange` (`QGraphicsItem::GraphicsItemChange change, const QVariant &value`).

[override virtual protected] void QGraphicsProxyWidget::keyPressEvent(QKeyEvent *event)

Implementiert: ` QGraphicsItem::keyPressEvent(QKeyEvent *event)`.

[override virtual protected] void QGraphicsProxyWidget::keyReleaseEvent(QKeyEvent *event)

Implementiert neu: QGraphicsItem::keyReleaseEvent(QKeyEvent *event).

[override virtual protected] void QGraphicsProxyWidget::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)

Umsetzt: ` QGraphicsItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)`.

[override virtual protected] void QGraphicsProxyWidget::mouseMoveEvent(QGraphicsSceneMouseEvent *event)

Umsetzt: ` QGraphicsItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)`.

[override virtual protected] void QGraphicsProxyWidget::mousePressEvent(QGraphicsSceneMouseEvent *event)

Umsetzt: ` QGraphicsItem::mousePressEvent(QGraphicsSceneMouseEvent *event)`.

[override virtual protected] void QGraphicsProxyWidget::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)

Umsetzt: ` QGraphicsItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)`.

[protected slot] QGraphicsProxyWidget *QGraphicsProxyWidget::newProxyWidget(const QWidget *child)

Erstellt ein Proxy-Widget für die angegebene „ child “ des in diesem Proxy enthaltenen Widgets.

Sie sollten diese Funktion nicht direkt aufrufen; verwenden Sie stattdessen ` QGraphicsProxyWidget::createProxyForChildWidget()`.

Diese Funktion ist ein vorgetäuschter virtueller Slot, den Sie in Ihrer Unterklasse neu implementieren können, um zu steuern, wie neue Proxy-Widgets erstellt werden. Die Standardimplementierung gibt ein Proxy zurück, das mit dem Konstruktor ` QGraphicsProxyWidget()` erstellt wurde und dieses Proxy-Widget als Elternelement hat.

Siehe auch ` createProxyForChildWidget()`.

[override virtual] void QGraphicsProxyWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)

Implementiert: ` QGraphicsWidget::paint` (`QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget`).

[override virtual protected] void QGraphicsProxyWidget::resizeEvent(QGraphicsSceneResizeEvent *event)

Umsetzt: ` QGraphicsWidget::resizeEvent(QGraphicsSceneResizeEvent *event)`.

[override virtual] void QGraphicsProxyWidget::setGeometry(const QRectF &rect)

Implementiert: ` QGraphicsLayoutItem::setGeometry` (const QRectF &rect).

void QGraphicsProxyWidget::setWidget(QWidget *widget)

Bindet „ widget “ in dieses Proxy-Widget ein. Das eingebettete Widget darf sich ausschließlich entweder innerhalb oder außerhalb der Grafikansicht befinden. Sie können ein Widget nicht einbetten, solange es gleichzeitig an anderer Stelle in der Benutzeroberfläche sichtbar ist.

widget Es muss sich um ein Widget der obersten Ebene handeln, dessen übergeordnetes Widget „ nullptr “ ist.

Wenn das Widget eingebettet wird, wird sein Zustand (z. B. Sichtbarkeit, Aktivierung, Geometrie, Größenhinweise) in das Proxy-Widget kopiert. Wenn das eingebettete Widget explizit ausgeblendet oder deaktiviert ist, wird das Proxy-Widget nach Abschluss der Einbettung ebenfalls explizit ausgeblendet oder deaktiviert. Die Klassendokumentation enthält eine vollständige Übersicht über den gemeinsam genutzten Zustand.

QGraphicsProxyWidgetDie Fensterflags von `xml-ph-0000@deepl.internal` bestimmen, ob das Widget nach der Einbettung mit Fensterdekorationen versehen wird oder nicht.

Nachdem diese Funktion zurückkehrt, sorgt ` QGraphicsProxyWidget ` dafür, dass sein Zustand so weit wie möglich mit dem von ` widget ` synchronisiert bleibt.

Wenn zum Zeitpunkt des Aufrufs dieser Funktion bereits ein Widget von diesem Proxy eingebettet ist, wird dieses Widget zunächst automatisch aus der Einbettung entfernt. Die Übergabe von ` nullptr ` als Argument für ` widget ` führt lediglich zur Aufhebung der Einbettung des Widgets, und die Eigentümerschaft am aktuell eingebetteten Widget wird an den Aufrufer übertragen. Jedes eingebettete untergeordnete Widget wird ebenfalls eingebettet und dessen Proxy-Widget zerstört.

Beachten Sie, dass Widgets, bei denen das Widget-Attribut „ Qt::WA_PaintOnScreen “ gesetzt ist, sowie Widgets, die eine externe Anwendung oder einen Controller umschließen, nicht eingebettet werden können. Beispiele hierfür sind „ QOpenGLWidget “ und „QAxWidget“.

Siehe auch ` widget()`.

[override virtual protected] void QGraphicsProxyWidget::showEvent(QShowEvent *event)

Implementiert: ` QGraphicsWidget::showEvent(QShowEvent *event)`.

[override virtual protected] QSizeF QGraphicsProxyWidget::sizeHint(Qt::SizeHint which, const QSizeF &constraint = QSizeF()) const

Implementiert neu: ` QGraphicsWidget::sizeHint` (Qt::SizeHint which, const QSizeF &constraint) const.

QRectF QGraphicsProxyWidget::subWidgetRect(const QWidget *widget) const

Gibt das Rechteck für „ widget “ zurück, das ein Nachkomme von „ widget()“ oder „ widget()“ selbst sein muss, und zwar in den lokalen Koordinaten dieses Proxy-Elements.

Wenn kein Widget eingebettet ist, „ widget “ gleich „ nullptr “ ist oder „ widget “ kein Nachkomme des eingebetteten Widgets ist, gibt diese Funktion ein leeres „ QRectF “ zurück.

Siehe auch widget().

[override virtual] int QGraphicsProxyWidget::type() const

Implementiert: ` QGraphicsWidget::type()` const.

[override virtual protected] void QGraphicsProxyWidget::ungrabMouseEvent(QEvent *event)

Umsetzt: ` QGraphicsWidget::ungrabMouseEvent(QEvent *event)`.

[override virtual protected] void QGraphicsProxyWidget::wheelEvent(QGraphicsSceneWheelEvent *event)

Umsetzt: ` QGraphicsItem::wheelEvent(QGraphicsSceneWheelEvent *event)`.

QWidget *QGraphicsProxyWidget::widget() const

Gibt einen Zeiger auf das eingebettete Widget zurück.

Siehe auch „ setWidget()“.

© 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.