QGraphicsProxyWidget Class
La clase QGraphicsProxyWidget proporciona una capa proxy para incrustar un QWidget en un QGraphicsScene. Más...
| Cabecera: | #include <QGraphicsProxyWidget> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Widgets)target_link_libraries(mytarget PRIVATE Qt6::Widgets) |
| qmake: | QT += widgets |
| Hereda: | QGraphicsWidget |
Tipos Públicos
| enum { Type } |
Funciones Públicas
| 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 |
Funciones Públicas Reimplementadas
| virtual void | paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override |
| virtual void | setGeometry(const QRectF &rect) override |
| virtual int | type() const override |
Funciones protegidas reimplementadas
| 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 |
Ranuras protegidas
| QGraphicsProxyWidget * | newProxyWidget(const QWidget *child) |
Descripción Detallada
QGraphicsProxyWidget incrusta widgets basados en QWidget, por ejemplo, un QPushButton, QFontComboBox, o incluso QFileDialog, en QGraphicsScene. Transmite eventos entre los dos objetos y traduce entre la geometría basada en enteros de QWidget y la geometría basada en qreales de QGraphicsWidget. QGraphicsProxyWidget es compatible con todas las funciones básicas de QWidget, incluidos el enfoque de pestañas, la entrada de teclado, arrastrar y soltar y las ventanas emergentes. También puede incrustar widgets complejos, por ejemplo, widgets con subwidgets.
Ejemplo:
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 encarga de incrustar automáticamente popups hijos de widgets incrustados mediante la creación de un proxy hijo para cada popup. Esto significa que cuando un QComboBox incrustado muestra su lista de popups, un nuevo QGraphicsProxyWidget se crea automáticamente, incrustando el popup, y posicionándolo correctamente. Esto sólo funciona si el popup es hijo del widget incrustado (por ejemplo QToolButton::setMenu() requiere que la instancia QMenu sea hija de QToolButton).
Incrustar un Widget con QGraphicsProxyWidget
Hay dos formas de incrustar un widget usando QGraphicsProxyWidget. La forma más común es pasar un puntero de widget a QGraphicsScene::addWidget() junto con cualquier Qt::WindowFlags relevante. Esta función devuelve un puntero a un QGraphicsProxyWidget. Entonces puedes elegir entre reparentar o posicionar el proxy, o el propio widget incrustado.
Por ejemplo, en el siguiente fragmento de código, incrustamos un cuadro de grupo en el 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();
La imagen de abajo es la salida obtenida con su margen de contenido y su rectángulo de contenido etiquetados.

Alternativamente, puedes empezar creando un nuevo elemento QGraphicsProxyWidget, y luego llamar a setWidget() para incrustar un QWidget más tarde. La función widget() devuelve un puntero al widget incrustado. QGraphicsProxyWidget comparte propiedad con QWidget, por lo que si cualquiera de los dos widgets es destruido, el otro widget será automáticamente destruido también.
Sincronización de estados de widgets
QGraphicsProxyWidget mantiene su estado sincronizado con el widget incrustado. Por ejemplo, si el proxy está oculto o deshabilitado, el widget incrustado también lo estará, y viceversa. Cuando el widget es incrustado llamando a addWidget(), QGraphicsProxyWidget copia el estado del widget en el proxy, y después de eso, los dos permanecerán sincronizados cuando sea posible. Por defecto, cuando incrustas un widget en un proxy, tanto el widget como el proxy serán visibles porque un QGraphicsWidget es visible cuando se crea (no tienes que llamar a show()). Si ocultas explícitamente el widget incrustado, el proxy también se volverá invisible.
Ejemplo:
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 mantiene simetría para los siguientes estados:
| QWidget estado | QGraphicsProxyWidget estado | Notas |
|---|---|---|
| QWidget::enabled | QGraphicsProxyWidget::habilitado | |
| QWidget::visible | QGraphicsProxyWidget::visible | El estado explícito también es simétrico. |
| QWidget::geometry | QGraphicsProxyWidget::geometría | Sólo se garantiza que la geometría sea simétrica mientras el widget incrustado sea visible. |
| QWidget::layoutDirection | QGraphicsProxyWidget::layoutDirección | |
| QWidget::style | QGraphicsProxyWidget::estilo | |
| QWidget::palette | QGraphicsProxyWidget::paleta | |
| QWidget::font | QGraphicsProxyWidget::fuente | |
| QWidget::cursor | QGraphicsProxyWidget::cursor | El widget incrustado anula el cursor del widget proxy. El cursor del proxy cambia dependiendo del subwidget incrustado que esté actualmente bajo el ratón. |
| QWidget::sizeHint() | QGraphicsProxyWidget::sizeHint() | Toda la funcionalidad de sugerencia de tamaño del widget incrustado es reenviada por el proxy. |
| QWidget::getMargenesDeContenido() | QGraphicsProxyWidget::getContentsMargins() | Actualizado una vez por setWidget(). |
| QWidget::windowTitle | QGraphicsProxyWidget::títuloDeLaVentana | Actualizado una vez por setWidget(). |
Nota: QGraphicsScene mantiene el widget incrustado en un estado especial que evita que moleste a otros widgets (tanto incrustados como no incrustados) mientras el widget está incrustado. En este estado, el comportamiento del widget puede diferir ligeramente de cuando no está incrustado.
Advertencia: Esta clase se proporciona por conveniencia cuando se puentean QWidgets y QGraphicsItems, no debería usarse para escenarios de alto rendimiento. En particular, incrustar widgets en una escena que luego se muestra a través de un QGraphicsView que utiliza un viewport OpenGL no funcionará para todas las combinaciones.
Véase también QGraphicsScene::addWidget() y QGraphicsWidget.
Documentación de tipos de miembros
[anonymous] enum
El valor devuelto por la función virtual type().
| Constante | Valor | Descripción |
|---|---|---|
QGraphicsProxyWidget::Type | 12 | Un widget proxy de gráficos |
Documentación de la función miembro
QGraphicsProxyWidget::QGraphicsProxyWidget(QGraphicsItem *parent = nullptr, Qt::WindowFlags wFlags = Qt::WindowFlags())
Construye un nuevo widget QGraphicsProxy. parent y wFlags se pasan al constructor de QGraphicsItem.
[virtual noexcept] QGraphicsProxyWidget::~QGraphicsProxyWidget()
Destruye el widget proxy y cualquier widget incrustado.
[override virtual protected] void QGraphicsProxyWidget::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
Reimplementa: QGraphicsItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *event).
QGraphicsProxyWidget *QGraphicsProxyWidget::createProxyForChildWidget(QWidget *child)
Crea un widget proxy para el child dado del widget contenido en este proxy.
Esta función permite adquirir proxies para widgets que no sean de nivel superior. Por ejemplo, puede incrustar un diálogo y luego transformar sólo uno de sus widgets.
Si el widget ya está incrustado, devuelve el widget proxy existente.
Véase también newProxyWidget() y QGraphicsScene::addWidget().
[override virtual protected] void QGraphicsProxyWidget::dragEnterEvent(QGraphicsSceneDragDropEvent *event)
Reimplementa: QGraphicsItem::dragEnterEvent(QGraphicsSceneDragDropEvent *event).
[override virtual protected] void QGraphicsProxyWidget::dragLeaveEvent(QGraphicsSceneDragDropEvent *event)
Reimplementa: QGraphicsItem::dragLeaveEvent(QGraphicsSceneDragDropEvent *event).
[override virtual protected] void QGraphicsProxyWidget::dragMoveEvent(QGraphicsSceneDragDropEvent *event)
Reimplementa: QGraphicsItem::dragMoveEvent(QGraphicsSceneDragDropEvent *event).
[override virtual protected] void QGraphicsProxyWidget::dropEvent(QGraphicsSceneDragDropEvent *event)
Reimplementa: QGraphicsItem::dropEvent(QGraphicsSceneDragDropEvent *event).
[override virtual protected] bool QGraphicsProxyWidget::event(QEvent *event)
Reimplementa: QGraphicsWidget::event(QEvent *event).
[override virtual protected] bool QGraphicsProxyWidget::eventFilter(QObject *object, QEvent *event)
Reimplementa: QObject::eventFilter(QObject *watched, QEvent *event).
[override virtual protected] void QGraphicsProxyWidget::focusInEvent(QFocusEvent *event)
Reimplementa: QGraphicsWidget::focusInEvent(QFocusEvent *event).
[override virtual protected] bool QGraphicsProxyWidget::focusNextPrevChild(bool next)
Reimplementa: QGraphicsWidget::focusNextPrevChild(bool next).
[override virtual protected] void QGraphicsProxyWidget::focusOutEvent(QFocusEvent *event)
Reimplementa: QGraphicsWidget::focusOutEvent(QFocusEvent *event).
[override virtual protected] void QGraphicsProxyWidget::grabMouseEvent(QEvent *event)
Reimplementa: QGraphicsWidget::grabMouseEvent(QEvent *event).
[override virtual protected] void QGraphicsProxyWidget::hideEvent(QHideEvent *event)
Reimplementa: QGraphicsWidget::hideEvent(QHideEvent *event).
[override virtual protected] void QGraphicsProxyWidget::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
Reimplementa: QGraphicsItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event).
[override virtual protected] void QGraphicsProxyWidget::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
Reimplementa: QGraphicsWidget::hoverLeaveEvent(QGraphicsSceneHoverEvent *event).
[override virtual protected] void QGraphicsProxyWidget::hoverMoveEvent(QGraphicsSceneHoverEvent *event)
Reimplementa: QGraphicsWidget::hoverMoveEvent(QGraphicsSceneHoverEvent *event).
[override virtual protected] void QGraphicsProxyWidget::inputMethodEvent(QInputMethodEvent *event)
Reimplementa: QGraphicsItem::inputMethodEvent(QInputMethodEvent *event).
[override virtual protected] QVariant QGraphicsProxyWidget::inputMethodQuery(Qt::InputMethodQuery query) const
Reimplementa: QGraphicsItem::inputMethodQuery(Qt::InputMethodQuery query) const.
[override virtual protected] QVariant QGraphicsProxyWidget::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value)
Reimplementa: QGraphicsWidget::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value).
[override virtual protected] void QGraphicsProxyWidget::keyPressEvent(QKeyEvent *event)
Reimplementa: QGraphicsItem::keyPressEvent(QKeyEvent *event).
[override virtual protected] void QGraphicsProxyWidget::keyReleaseEvent(QKeyEvent *event)
Reimplementa: QGraphicsItem::keyReleaseEvent(QKeyEvent *event).
[override virtual protected] void QGraphicsProxyWidget::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
Reimplementa: QGraphicsItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event).
[override virtual protected] void QGraphicsProxyWidget::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
Reimplementa: QGraphicsItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event).
[override virtual protected] void QGraphicsProxyWidget::mousePressEvent(QGraphicsSceneMouseEvent *event)
Reimplementa: QGraphicsItem::mousePressEvent(QGraphicsSceneMouseEvent *event).
[override virtual protected] void QGraphicsProxyWidget::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
Reimplementa: QGraphicsItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event).
[protected slot] QGraphicsProxyWidget *QGraphicsProxyWidget::newProxyWidget(const QWidget *child)
Crea un widget proxy para el child dado del widget contenido en este proxy.
No debe llamar a esta función directamente; utilice QGraphicsProxyWidget::createProxyForChildWidget() en su lugar.
Esta función es una ranura virtual falsa que puedes reimplementar en tu subclase para controlar cómo se crean los nuevos widgets proxy. La implementación por defecto devuelve un proxy creado con el constructor QGraphicsProxyWidget() con este widget proxy como padre.
Véase también createProxyForChildWidget().
[override virtual] void QGraphicsProxyWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
Reimplementa: QGraphicsWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget).
[override virtual protected] void QGraphicsProxyWidget::resizeEvent(QGraphicsSceneResizeEvent *event)
Reimplementa: QGraphicsWidget::resizeEvent(QGraphicsSceneResizeEvent *event).
[override virtual] void QGraphicsProxyWidget::setGeometry(const QRectF &rect)
Reimplementa: QGraphicsLayoutItem::setGeometry(const QRectF &rect).
void QGraphicsProxyWidget::setWidget(QWidget *widget)
Incrusta widget en este widget proxy. El widget incrustado debe residir exclusivamente dentro o fuera de la Vista Gráfica. No se puede incrustar un widget mientras esté visible en otra parte de la interfaz de usuario, al mismo tiempo.
widget debe ser un widget de nivel superior cuyo padre sea nullptr.
Cuando se incrusta el widget, su estado (por ejemplo, visible, activado, geometría, sugerencias de tamaño) se copia en el widget proxy. Si el widget incrustado está explícitamente oculto o desactivado, el widget proxy pasará a estar explícitamente oculto o desactivado una vez finalizada la incrustación. La documentación de la clase tiene una visión completa sobre el estado compartido.
QGraphicsProxyWidgetLas banderas de ventana de 's determinan si el widget, después de la incrustación, recibirá decoraciones de ventana o no.
Una vez devuelta esta función, QGraphicsProxyWidget mantendrá su estado sincronizado con el de widget siempre que sea posible.
Si un widget ya está incrustado por este proxy cuando se llama a esta función, ese widget se desincrustará automáticamente. Si se pasa nullptr como argumento a widget, sólo se desincrustará el widget, y la propiedad del widget actualmente incrustado se pasará al llamante. Cada widget hijo que esté incrustado también será incrustado y su widget proxy será destruido.
Ten en cuenta que los widgets con el atributo Qt::WA_PaintOnScreen widget establecido y los widgets que envuelven una aplicación o controlador externo no se pueden incrustar. Algunos ejemplos son QOpenGLWidget y QAxWidget.
Véase también widget().
[override virtual protected] void QGraphicsProxyWidget::showEvent(QShowEvent *event)
Reimplementa: QGraphicsWidget::showEvent(QShowEvent *event).
[override virtual protected] QSizeF QGraphicsProxyWidget::sizeHint(Qt::SizeHint which, const QSizeF &constraint = QSizeF()) const
Reimplementa: QGraphicsWidget::sizeHint(Qt::SizeHint which, const QSizeF &constraint) const.
QRectF QGraphicsProxyWidget::subWidgetRect(const QWidget *widget) const
Devuelve el rectángulo de widget, que debe ser descendiente de widget(), o del propio widget(), en las coordenadas locales de este elemento proxy.
Si no hay ningún widget incrustado, widget es nullptr, o widget no es descendiente del widget incrustado, esta función devuelve un QRectF vacío.
Véase también widget().
[override virtual] int QGraphicsProxyWidget::type() const
Reimplementa: QGraphicsWidget::type() const.
[override virtual protected] void QGraphicsProxyWidget::ungrabMouseEvent(QEvent *event)
Reimplementa: QGraphicsWidget::ungrabMouseEvent(QEvent *event).
[override virtual protected] void QGraphicsProxyWidget::wheelEvent(QGraphicsSceneWheelEvent *event)
Reimplementa: QGraphicsItem::wheelEvent(QGraphicsSceneWheelEvent *event).
QWidget *QGraphicsProxyWidget::widget() const
Devuelve un puntero al widget incrustado.
Véase también 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.