QGraphicsProxyWidget Class

Die Klasse QGraphicsProxyWidget bietet eine Proxy-Schicht für die Einbettung von QWidget in eine QGraphicsScene. Mehr...

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

Öffentliche Typen

enum anonymous { 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

Reimplementierte ö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

Reimplementierte 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 Steckplätze

QGraphicsProxyWidget *newProxyWidget(const QWidget *child)

Detaillierte Beschreibung

QGraphicsProxyWidget bettet QWidget-basierte Widgets, z.B. ein QPushButton, QFontComboBox oder auch QFileDialog, in QGraphicsScene ein. Es leitet Ereignisse zwischen den beiden Objekten weiter und übersetzt zwischen der Integer-basierten Geometrie von QWidget und der QReal-basierten Geometrie von QGraphicsWidget. QGraphicsProxyWidget unterstützt alle Kernfunktionen von QWidget, einschließlich Tabulator-Fokus, Tastatureingabe, Drag & Drop und Popups. Sie können auch komplexe Widgets einbetten, z.B. Widgets mit Subwidgets.

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 kümmert sich um die automatische Einbettung von Popup-Kindern eingebetteter Widgets, indem es einen Kind-Proxy für jedes Popup erstellt. Das bedeutet, dass, wenn ein eingebettetes QComboBox seine Popup-Liste anzeigt, automatisch ein neues QGraphicsProxyWidget erstellt wird, das das Popup einbettet und es korrekt positioniert. Dies funktioniert nur, wenn das Popup ein Kind des eingebetteten Widgets ist (zum Beispiel erfordert QToolButton::setMenu(), dass die QMenu Instanz ein Kind des QToolButton ist).

Einbetten eines Widgets mit QGraphicsProxyWidget

Es gibt zwei Möglichkeiten, ein Widget mit QGraphicsProxyWidget einzubetten. Der gebräuchlichste Weg ist die Übergabe eines Widget-Zeigers an QGraphicsScene::addWidget() zusammen mit allen relevanten Qt::WindowFlags. Diese Funktion gibt einen Zeiger auf ein QGraphicsProxyWidget zurück. Sie können dann wählen, ob Sie entweder den Proxy oder das eingebettete Widget selbst reparieren oder positionieren möchten.

Im folgenden Codeschnipsel wird zum Beispiel ein Gruppenrahmen in den Proxy eingebettet:

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();

Das folgende Bild zeigt die Ausgabe, die mit dem Rand und dem Rechteck des Inhalts beschriftet ist.

Alternativ können Sie auch zunächst ein neues QGraphicsProxyWidget-Element erstellen und dann setWidget() aufrufen, um später ein QWidget einzubetten. Die Funktion widget() gibt einen Zeiger auf das eingebettete Widget zurück. QGraphicsProxyWidget teilt sich den Besitz mit QWidget. Wenn also eines der beiden Widgets zerstört wird, wird auch das andere Widget automatisch zerstört.

Synchronisieren von Widget-Zuständen

QGraphicsProxyWidget hält seinen Status mit dem des eingebetteten Widgets synchronisiert. Wenn z.B. der Proxy versteckt oder deaktiviert ist, wird das eingebettete Widget ebenfalls versteckt oder deaktiviert und vice versa. Wenn das Widget durch den Aufruf von addWidget() eingebettet wird, kopiert QGraphicsProxyWidget den Status des Widgets in den Proxy, und danach bleiben die beiden, soweit möglich, synchronisiert. Wenn Sie ein Widget in einen Proxy einbetten, sind standardmäßig sowohl das Widget als auch der Proxy sichtbar, da ein QGraphicsWidget bei der Erstellung sichtbar ist (Sie müssen nicht show() 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 behält die Symmetrie für die folgenden Zustände bei:

QWidget ZustandQGraphicsProxyWidget ZustandAnmerkungen
QWidget::enabledQGraphicsProxyWidget::aktiviert
QWidget::visibleQGraphicsProxyWidget::sichtbarDer explizite Zustand ist ebenfalls symmetrisch.
QWidget::geometryQGraphicsProxyWidget::GeometrieDie Geometrie ist nur dann garantiert symmetrisch, wenn das eingebettete Widget sichtbar ist.
QWidget::layoutDirectionQGraphicsProxyWidget::layoutDirection
QWidget::styleQGraphicsProxyWidget::Stil
QWidget::paletteQGraphicsProxyWidget::palette
QWidget::fontQGraphicsProxyWidget::Schriftart
QWidget::cursorQGraphicsProxyWidget::MauszeigerDas eingebettete Widget hat Vorrang vor dem Proxy-Widget-Cursor. Der Proxy-Cursor ändert sich je nachdem, welches eingebettete Subwidget sich gerade unter der Maus befindet.
QWidget::sizeHint()QGraphicsProxyWidget::sizeHint()Die gesamte Funktionalität des Größenhinweises des eingebetteten Widgets wird durch den Proxy weitergeleitet.
QWidget::getContentsMargins()QGraphicsProxyWidget::getContentsMargins()Wird einmal durch setWidget() aktualisiert.
QWidget::windowTitleQGraphicsProxyWidget::windowTitleEinmalig aktualisiert durch setWidget().

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, während das Widget eingebettet ist. In diesem Zustand kann sich das Widget etwas anders verhalten als wenn es nicht eingebettet ist.

Warnung: Diese Klasse dient der Bequemlichkeit beim Überbrücken von QWidgets und QGraphicsItems, sie sollte nicht für Hochleistungsszenarien verwendet werden. Insbesondere das Einbetten von Widgets in eine Szene, die dann über eine QGraphicsView angezeigt wird, die ein OpenGL-Viewport verwendet, wird nicht für alle Kombinationen funktionieren.

Siehe auch QGraphicsScene::addWidget() und QGraphicsWidget.

Dokumentation der Mitgliedstypen

enum QGraphicsProxyWidget::anonymous

Der Wert, der von der virtuellen Funktion type() zurückgegeben wird.

KonstanteWertBeschreibung
QGraphicsProxyWidget::Type12Ein Grafik-Proxy-Widget

Dokumentation der Mitgliedsfunktionen

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

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

[virtual noexcept] QGraphicsProxyWidget::~QGraphicsProxyWidget()

Zerstört das Proxy-Widget und alle eingebetteten Widgets.

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

Reimplements: QGraphicsItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *event).

QGraphicsProxyWidget *QGraphicsProxyWidget::createProxyForChildWidget(QWidget *child)

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

Mit dieser Funktion ist es möglich, Proxys für Widgets zu erstellen, die nicht der obersten Ebene angehören. Sie können zum Beispiel einen Dialog einbetten und dann nur eines seiner Widgets umwandeln.

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)

Reimplements: QGraphicsItem::dragEnterEvent(QGraphicsSceneDragDropEvent *event).

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

Reimplements: QGraphicsItem::dragLeaveEvent(QGraphicsSceneDragDropEvent *event).

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

Reimplements: QGraphicsItem::dragMoveEvent(QGraphicsSceneDragDropEvent *event).

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

Reimplements: QGraphicsItem::dropEvent(QGraphicsSceneDragDropEvent *event).

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

Reimplements: QGraphicsWidget::event(QEvent *Event).

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

Reimplements: QObject::eventFilter(QObject *watched, QEvent *event).

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

Reimplements: QGraphicsWidget::focusInEvent(QFocusEvent *event).

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

Reimplements: QGraphicsWidget::focusNextPrevChild(bool next).

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

Reimplements: QGraphicsWidget::focusOutEvent(QFocusEvent *event).

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

Reimplements: QGraphicsWidget::grabMouseEvent(QEvent *Event).

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

Reimplements: QGraphicsWidget::hideEvent(QHideEvent *event).

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

Reimplements: QGraphicsItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event).

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

Reimplements: QGraphicsWidget::hoverLeaveEvent(QGraphicsSceneHoverEvent *event).

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

Reimplements: QGraphicsWidget::hoverMoveEvent(QGraphicsSceneHoverEvent *event).

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

Reimplements: QGraphicsItem::inputMethodEvent(QInputMethodEvent *event).

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

Reimplements: QGraphicsItem::inputMethodQuery(Qt::InputMethodQuery query) const.

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

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

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

Reimplements: QGraphicsItem::keyPressEvent(QKeyEvent *event).

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

Reimplements: QGraphicsItem::keyReleaseEvent(QKeyEvent *event).

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

Reimplements: QGraphicsItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event).

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

Reimplements: QGraphicsItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event).

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

Reimplements: QGraphicsItem::mousePressEvent(QGraphicsSceneMouseEvent *event).

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

Reimplements: QGraphicsItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event).

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

Erzeugt 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 gefälschter virtueller Slot, den Sie in Ihrer Unterklasse reimplementieren können, um zu kontrollieren, wie neue Proxy-Widgets erstellt werden. Die Standardimplementierung gibt einen Proxy zurück, der mit dem QGraphicsProxyWidget()-Konstruktor mit diesem Proxy-Widget als Elternteil erstellt wurde.

Siehe auch createProxyForChildWidget().

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

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

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

Reimplements: QGraphicsWidget::resizeEvent(QGraphicsSceneResizeEvent *event).

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

Reimplements: QGraphicsLayoutItem::setGeometry(const QRectF &rect).

void QGraphicsProxyWidget::setWidget(QWidget *widget)

Bettet widget in dieses Proxy-Widget ein. Das eingebettete Widget muss 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 muss ein Top-Level-Widget sein, dessen Elternteil nullptr ist.

Wenn das Widget eingebettet wird, wird sein Zustand (z. B. sichtbar, aktiviert, 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 explizit ausgeblendet oder deaktiviert. Die Klassendokumentation bietet einen vollständigen Überblick über den gemeinsamen Status.

QGraphicsProxyWidgetDie Fenster-Flags bestimmen, ob das Widget nach der Einbettung mit Fensterdekorationen versehen wird oder nicht.

Nachdem diese Funktion zurückgekehrt ist, hält QGraphicsProxyWidget seinen Zustand mit dem von widget synchronisiert, wann immer dies möglich ist.

Wenn ein Widget bereits von diesem Proxy eingebettet ist, wenn diese Funktion aufgerufen wird, wird dieses Widget zunächst automatisch entbettet. Die Übergabe von nullptr für das Argument widget hebt nur die Einbettung des Widgets auf, und der Besitz des aktuell eingebetteten Widgets wird an den Aufrufer weitergegeben. Alle Kind-Widgets, die eingebettet sind, werden ebenfalls eingebettet und ihr Proxy-Widget zerstört.

Beachten Sie, dass Widgets mit dem Qt::WA_PaintOnScreen Widget-Attribut und Widgets, die eine externe Anwendung oder einen Controller umhüllen, nicht eingebettet werden können. Beispiele sind QOpenGLWidget und QAxWidget.

Siehe auch widget().

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

Reimplements: QGraphicsWidget::showEvent(QShowEvent *event).

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

Reimplements: 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, in den lokalen Koordinaten dieses Proxy-Elements.

Wenn kein Widget eingebettet ist, widget 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

Reimplements: QGraphicsWidget::type() const.

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

Reimplements: QGraphicsWidget::ungrabMouseEvent(QEvent *Event).

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

Reimplements: QGraphicsItem::wheelEvent(QGraphicsSceneWheelEvent *event).

QWidget *QGraphicsProxyWidget::widget() const

Gibt einen Zeiger auf das eingebettete Widget zurück.

Siehe auch setWidget().

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