Sur cette page

QGraphicsProxyWidget Class

La classe `QGraphicsProxyWidget` fournit une couche de proxy permettant d'intégrer une ` QWidget ` dans une ` QGraphicsScene`. En savoir plus...

En-tête : #include <QGraphicsProxyWidget>
CMake : find_package(Qt6 REQUIRED COMPONENTS Widgets)
target_link_libraries(mytarget PRIVATE Qt6::Widgets)
qmake : QT += widgets
Hérite de : QGraphicsWidget

Types publics

enum { Type }

Fonctions publiques

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

Fonctions publiques réimplémentées

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

Fonctions protégées réimplémentées

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

Emplacements protégés

QGraphicsProxyWidget *newProxyWidget(const QWidget *child)

Description détaillée

QGraphicsProxyWidget intègre des widgets basés sur QWidget, par exemple un QPushButton, un QFontComboBox ou même un QFileDialog, dans QGraphicsScene. Il transmet les événements entre les deux objets et assure la conversion entre la géométrie basée sur des entiers de QWidget et celle basée sur des qreal de QGraphicsWidget. QGraphicsProxyWidget prend en charge toutes les fonctionnalités principales de QWidget, notamment le focus sur les onglets, la saisie au clavier, le glisser-déposer et les fenêtres contextuelles. Vous pouvez également intégrer des widgets complexes, par exemple des widgets comportant des sous-widgets.

Exemple :

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 se charge d’intégrer automatiquement les listes déroulantes enfants des widgets intégrés en créant un proxy enfant pour chaque liste déroulante. Cela signifie que lorsqu’un QComboBox intégré affiche sa liste déroulante, un nouveau QGraphicsProxyWidget est créé automatiquement, intégrant la liste déroulante et la positionnant correctement. Cela ne fonctionne que si la fenêtre contextuelle est un enfant du widget intégré (par exemple, QToolButton::setMenu() nécessite que l’instance QMenu soit un enfant de QToolButton).

Intégration d’un widget avec QGraphicsProxyWidget

Il existe deux façons d’intégrer un widget à l’aide de `QGraphicsProxyWidget`. La méthode la plus courante consiste à passer un pointeur vers le widget à la fonction ` QGraphicsScene::addWidget()` avec tout ` Qt::WindowFlags` pertinent. Cette fonction renvoie un pointeur vers un `QGraphicsProxyWidget`. Vous pouvez ensuite choisir de redéfinir le parent ou de positionner soit le proxy, soit le widget intégré lui-même.

Par exemple, dans l'extrait de code ci-dessous, nous intégrons une zone de groupe dans le proxy :

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

L’image ci-dessous montre le résultat obtenu, avec la marge du contenu et le rectangle du contenu indiqués.

Le widget proxy et son widget intégré, avec leurs positions respectives

Vous pouvez également commencer par créer un nouvel élément QGraphicsProxyWidget, puis appeler la fonction setWidget() pour y intégrer un QWidget ultérieurement. La fonction widget() renvoie un pointeur vers le widget intégré. QGraphicsProxyWidget partage la propriété avec QWidget; ainsi, si l’un des deux widgets est détruit, l’autre le sera automatiquement également.

Synchronisation des états des widgets

QGraphicsProxyWidget maintient son état synchronisé avec celui du widget intégré. Par exemple, si le proxy est masqué ou désactivé, le widget intégré le sera également, et inversement. Lorsque le widget est intégré via l'appel à addWidget(), QGraphicsProxyWidget copie l’état du widget dans le proxy, après quoi les deux resteront synchronisés dans la mesure du possible. Par défaut, lorsque vous intégrez un widget dans un proxy, le widget et le proxy sont tous deux visibles, car un QGraphicsWidget est visible dès sa création (vous n’avez pas besoin d’appeler ` show()`). Si vous masquez explicitement le widget intégré, le proxy deviendra également invisible.

Exemple :

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 maintient la symétrie pour les états suivants :

QWidget étatÉtat de QGraphicsProxyWidgetRemarques
QWidget::enabledQGraphicsProxyWidget::enabled
QWidget::visibleQGraphicsProxyWidget::visibleL'état explicite est également symétrique.
QWidget::geometryQGraphicsProxyWidget::geometryLa géométrie n’est garantie symétrique que tant que le widget intégré est visible.
QWidget::layoutDirectionQGraphicsProxyWidget::layoutDirection
QWidget::styleQGraphicsProxyWidget::style
QWidget::paletteQGraphicsProxyWidget::palette
QWidget::fontQGraphicsProxyWidget::font
QWidget::cursorQGraphicsProxyWidget::cursorLe widget intégré remplace le curseur du widget proxy. Le curseur du widget proxy change en fonction du sous-widget intégré sur lequel se trouve actuellement le pointeur de la souris.
QWidget::sizeHint()QGraphicsProxyWidget::sizeHint()Toutes les fonctionnalités de suggestion de taille provenant du widget intégré sont transmises par le proxy.
QWidget::getContentsMargins()QGraphicsProxyWidget::getContentsMargins()Mis à jour une fois par ` setWidget()` ().
QWidget::windowTitleQGraphicsProxyWidget::windowTitleMis à jour une fois par setWidget().

Remarque : QGraphicsScene maintient le widget intégré dans un état particulier qui l'empêche d'interférer avec d'autres widgets (intégrés ou non) tant qu'il est intégré. Dans cet état, le comportement du widget peut différer légèrement de celui qu'il présente lorsqu'il n'est pas intégré.

Avertissement : cette classe est fournie à titre de commodité pour établir une passerelle entre les QWidgets et les QGraphicsItems ; elle ne doit pas être utilisée dans des scénarios exigeant des performances élevées. En particulier, l’intégration de widgets dans une scène qui est ensuite affichée via un QGraphicsView utilisant une fenêtre d’affichage OpenGL ne fonctionnera pas pour toutes les combinaisons.

Voir également QGraphicsScene::addWidget() et QGraphicsWidget.

Documentation sur les types de membres

[anonymous] enum

Valeur renvoyée par la fonction virtuelle ` type()`.

ConstanteValeurDescription
QGraphicsProxyWidget::Type12Un widget proxy graphique

Documentation des fonctions membres

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

Crée un nouveau widget QGraphicsProxy. Les paramètres ` parent ` et ` wFlags ` sont transmis au constructeur de ` QGraphicsItem`.

[virtual noexcept] QGraphicsProxyWidget::~QGraphicsProxyWidget()

Supprime le widget proxy et tous les widgets intégrés.

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

Réimplémente : QGraphicsItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *event).

QGraphicsProxyWidget *QGraphicsProxyWidget::createProxyForChildWidget(QWidget *child)

Crée un widget proxy pour l'child e spécifiée du widget contenu dans ce proxy.

Cette fonction permet d'obtenir des proxys pour des widgets qui ne sont pas de niveau supérieur. Par exemple, vous pouvez intégrer une boîte de dialogue, puis transformer uniquement l'un de ses widgets.

Si le widget est déjà intégré, renvoie le widget proxy existant.

Voir également ` newProxyWidget()` et ` QGraphicsScene::addWidget()`.

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

Réimplémente : QGraphicsItem::dragEnterEvent(QGraphicsSceneDragDropEvent *event).

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

Réimplémente : QGraphicsItem::dragLeaveEvent(QGraphicsSceneDragDropEvent *event).

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

Réimplémente : QGraphicsItem::dragMoveEvent(QGraphicsSceneDragDropEvent *event).

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

Réimplémente : QGraphicsItem::dropEvent(QGraphicsSceneDragDropEvent *event).

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

Réimplémente : QGraphicsWidget::event(QEvent *event).

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

Réimplémente : QObject::eventFilter(QObject *watched, QEvent *event).

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

Réimplémente : QGraphicsWidget::focusInEvent(QFocusEvent *event).

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

Réimplémente : QGraphicsWidget::focusNextPrevChild(bool next).

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

Réimplémente : QGraphicsWidget::focusOutEvent(QFocusEvent *event).

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

Réimplémente : QGraphicsWidget::grabMouseEvent(QEvent *event).

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

Réimplémente : QGraphicsWidget::hideEvent(QHideEvent *event).

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

Réimplémente : QGraphicsItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event).

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

Réimplémente : QGraphicsWidget::hoverLeaveEvent(QGraphicsSceneHoverEvent *event).

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

Réimplémente : QGraphicsWidget::hoverMoveEvent(QGraphicsSceneHoverEvent *event).

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

Réimplémente : QGraphicsItem::inputMethodEvent(QInputMethodEvent *event).

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

Réimplémente : ` QGraphicsItem::inputMethodQuery` (requête `Qt::InputMethodQuery`) const.

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

Réimplémente : QGraphicsWidget::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value).

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

Réimplémente : QGraphicsItem::keyPressEvent(QKeyEvent *event).

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

Réimplémente : QGraphicsItem::keyReleaseEvent(QKeyEvent *event).

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

Réimplémente : ` QGraphicsItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)`.

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

Réimplémente : QGraphicsItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event).

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

Réimplémente : QGraphicsItem::mousePressEvent(QGraphicsSceneMouseEvent *event).

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

Réimplémente : QGraphicsItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event).

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

Crée un widget proxy pour l'child donné du widget contenu dans ce proxy.

Vous ne devez pas appeler cette fonction directement ; utilisez plutôt QGraphicsProxyWidget::createProxyForChildWidget().

Cette fonction est un faux slot virtuel que vous pouvez réimplémenter dans votre sous-classe afin de contrôler la manière dont les nouveaux widgets proxy sont créés. L’implémentation par défaut renvoie un proxy créé à l’aide du constructeur ` QGraphicsProxyWidget()` avec ce widget proxy comme parent.

Voir également createProxyForChildWidget().

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

Réimplémente : QGraphicsWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget).

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

Réimplémente : QGraphicsWidget::resizeEvent(QGraphicsSceneResizeEvent *event).

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

Réimplémente : QGraphicsLayoutItem::setGeometry(const QRectF &rect).

void QGraphicsProxyWidget::setWidget(QWidget *widget)

Intègre widget dans ce widget proxy. Le widget intégré doit se trouver exclusivement soit à l'intérieur, soit à l'extérieur de Graphics View. Vous ne pouvez pas intégrer un widget tant qu'il est visible ailleurs dans l'interface utilisateur, en même temps.

widget Il doit s’agir d’un widget de niveau supérieur dont le parent est nullptr.

Lorsque le widget est intégré, son état (par exemple, visibilité, activation, géométrie, indications de taille) est copié dans le widget proxy. Si le widget intégré est explicitement masqué ou désactivé, le widget proxy deviendra explicitement masqué ou désactivé une fois l’intégration terminée. La documentation de la classe fournit un aperçu complet de l’état partagé.

QGraphicsProxyWidgetLes indicateurs de fenêtre de xml-ph-0000@deepl.internal déterminent si le widget, après intégration, se verra attribuer des décorations de fenêtre ou non.

Une fois que cette fonction a renvoyé une valeur, ` QGraphicsProxyWidget ` maintiendra son état synchronisé avec celui de ` widget ` dans la mesure du possible.

Si un widget est déjà intégré par ce proxy lorsque cette fonction est appelée, ce widget sera d’abord automatiquement désintégré. Le fait de passer nullptr en tant qu’argument widget ne fera que désintégrer le widget, et la propriété du widget actuellement intégré sera transférée à l’appelant. Tous les widgets enfants qui sont intégrés le seront également et leur widget proxy sera détruit.

Notez que les widgets dont l’attribut Qt::WA_PaintOnScreen est défini et ceux qui encapsulent une application ou un contrôleur externe ne peuvent pas être intégrés. C’est le cas, par exemple, de QOpenGLWidget et de QAxWidget.

Voir également widget().

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

Réimplémente : QGraphicsWidget::showEvent(QShowEvent *event).

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

Réimplémente : QGraphicsWidget::sizeHint(Qt::SizeHint which, const QSizeF &constraint) const.

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

Renvoie le rectangle correspondant à ` widget`, qui doit être un descendant de ` widget()` ou de ` widget()` lui-même, dans les coordonnées locales de cet élément proxy.

Si aucun widget n’est intégré, si ` widget ` correspond à ` nullptr`, ou si ` widget ` n’est pas un descendant du widget intégré, cette fonction renvoie un ` QRectF` vide.

Voir également widget().

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

Réimplémente : QGraphicsWidget::type() const.

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

Réimplémente : QGraphicsWidget::ungrabMouseEvent(QEvent *event).

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

Réimplémente : QGraphicsItem::wheelEvent(QGraphicsSceneWheelEvent *event).

QWidget *QGraphicsProxyWidget::widget() const

Renvoie un pointeur vers le widget intégré.

Voir aussi 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.