En esta página

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.

Widget proxy y su widget incrustado con sus posiciones

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 estadoQGraphicsProxyWidget estadoNotas
QWidget::enabledQGraphicsProxyWidget::habilitado
QWidget::visibleQGraphicsProxyWidget::visibleEl estado explícito también es simétrico.
QWidget::geometryQGraphicsProxyWidget::geometríaSólo se garantiza que la geometría sea simétrica mientras el widget incrustado sea visible.
QWidget::layoutDirectionQGraphicsProxyWidget::layoutDirección
QWidget::styleQGraphicsProxyWidget::estilo
QWidget::paletteQGraphicsProxyWidget::paleta
QWidget::fontQGraphicsProxyWidget::fuente
QWidget::cursorQGraphicsProxyWidget::cursorEl 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::windowTitleQGraphicsProxyWidget::títuloDeLaVentanaActualizado 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().

ConstanteValorDescripción
QGraphicsProxyWidget::Type12Un 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.