QGraphicsProxyWidget 类

QGraphicsProxyWidget 类提供了一种代理层,用于在 QGraphicsScene 中嵌入 QWidget。有关详细信息,请参阅 更多...

头文件 #include <QGraphicsProxyWidget>
CMakefind_package(Qt6 REQUIRED COMPONENTS Widgets)
target_link_libraries(mytarget PRIVATE Qt6::Widgets)
qmakeQT += widgets
继承自 QGraphicsWidget

公开类型

枚举匿名枚举 { Type }

公开函数

QGraphicsProxyWidget(QGraphicsItem *parent = nullptr, Qt::WindowFlags wFlags = Qt::WindowFlags())
虚拟~QGraphicsProxyWidget()
QGraphicsProxyWidget *createProxyForChildWidget(QWidget *child)
voidsetWidget(QWidget *widget)
QRectFsubWidgetRect(const QWidget *widget) const
QWidget *widget() const

重新实现的公开函数

虚拟 voidpaint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override
虚拟 voidsetGeometry(const QRectF &rect) override
虚拟 inttype() const override

重新实现的保护函数

虚拟 voidcontextMenuEvent(QGraphicsSceneContextMenuEvent *event) override
虚拟 voiddragEnterEvent(QGraphicsSceneDragDropEvent *event) override
虚拟 voiddragLeaveEvent(QGraphicsSceneDragDropEvent *event) override
虚拟 voiddragMoveEvent(QGraphicsSceneDragDropEvent *event) override
虚拟 voiddropEvent(QGraphicsSceneDragDropEvent *event) override
虚拟 boolevent(QEvent *event) override
虚拟 booleventFilter(QObject *object, QEvent *event) override
虚拟 voidfocusInEvent(QFocusEvent *event) override
虚拟 boolfocusNextPrevChild(bool next) override
虚拟 voidfocusOutEvent(QFocusEvent *event) override
虚拟 voidgrabMouseEvent(QEvent *event) override
虚拟 voidhideEvent(QHideEvent *event) override
虚拟 voidhoverEnterEvent(QGraphicsSceneHoverEvent *event) override
虚拟 voidhoverLeaveEvent(QGraphicsSceneHoverEvent *event) override
虚拟 voidhoverMoveEvent(QGraphicsSceneHoverEvent *event) override
虚拟 voidinputMethodEvent(QInputMethodEvent *event) override
虚函数inputMethodQuery(Qt::InputMethodQuery query) const override
虚函数itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value) override
虚拟 voidkeyPressEvent(QKeyEvent *event) override
虚拟 voidkeyReleaseEvent(QKeyEvent *event) override
虚拟 voidmouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) override
虚拟 voidmouseMoveEvent(QGraphicsSceneMouseEvent *event) override
虚拟 voidmousePressEvent(QGraphicsSceneMouseEvent *event) override
虚拟 voidmouseReleaseEvent(QGraphicsSceneMouseEvent *event) override
虚拟 voidresizeEvent(QGraphicsSceneResizeEvent *event) override
虚拟 voidshowEvent(QShowEvent *event) override
虚函数sizeHint(Qt::SizeHint which, const QSizeF &constraint = QSizeF()) const override
虚拟 voidungrabMouseEvent(QEvent *event) override
虚拟 voidwheelEvent(QGraphicsSceneWheelEvent *event) override

受保护的槽函数

QGraphicsProxyWidget *newProxyWidget(const QWidget *child)

详细描述

QGraphicsProxyWidget用于嵌入QWidget基类的控件,例如QPushButton、QFontComboBox,甚至QFileDialog,到QGraphicsScene中。它负责在两个对象之间传递事件,并在QWidget的基于整数的几何形状和QGraphicsWidget的基于浮点数的几何形状之间进行转换。QGraphicsProxyWidget支持QWidget的所有核心功能,包括制表符焦点、键盘输入、拖放和弹出。您还可以嵌入复杂的控件,例如具有子控件的控件。

示例

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通过为每个弹出窗口创建一个子代理来自动嵌入嵌入控件的弹出子控件。这意味着当嵌入的QComboBox显示其弹出列表时,会自动创建一个新的QGraphicsProxyWidget,嵌入弹出窗口并将其正确定位。这仅当弹出窗口是嵌入窗口的子窗口时才有效(例如,QToolButton::setMenu()要求QMenu实例是QToolButton的子窗口)。

使用QGraphicsProxyWidget嵌入控件

使用QGraphicsProxyWidget嵌入控件有两种方法。最常见的方法是将控件指针传递给QGraphicsScene::addWidget()函数,同时提供任何相关的Qt::WindowFlags。此函数返回一个指向QGraphicsProxyWidget的指针。然后,您可以选择重新父化或定位代理或嵌入的控件本身。

例如,在下面的代码片段中,我们将组框嵌入到代理中

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

下面的图像显示了带内容边距和内容矩形的输出。

或者,您可以从创建一个新的 QGraphicsProxyWidget 对象开始,然后调用 setWidget() 来嵌入一个 QWidget。函数 widget() 返回嵌入的 widget 的指针。QGraphicsProxyWidget 与 QWidget 共享拥有权,所以如果两个 widget 中的任何一个被销毁,另一个 widget 也会自动销毁。

同步 Widget 状态

QGraphicsProxyWidget 将其状态与嵌入的 widget 保持同步。例如,如果代理被隐藏或禁用,嵌入的 widget 也会被隐藏或禁用,反之亦然。当通过调用 addWidget() 将 widget 嵌入时,QGraphicsProxyWidget 会将 widget 的状态复制到代理中,之后两个 widget 将尽可能保持同步。默认情况下,当您将 widget 嵌入代理时,widget 和代理都将可见,因为当创建 QGraphicsWidget 时它是可见的(您不需要调用 show())。如果您明确隐藏嵌入的 widget,则代理也将不可见。

示例

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 保持以下状态的一致性

QWidget 状态QGraphicsProxyWidget 状态注意
QWidget::enabledQGraphicsProxyWidget::enabled
QWidget::visibleQGraphicsProxyWidget::visible显式状态也是对称的。
QWidget::geometryQGraphicsProxyWidget::geometry几何形状只有在嵌入的 widget 可见时才保证保持对称。
QWidget::layoutDirectionQGraphicsProxyWidget::layoutDirection
QWidget::styleQGraphicsProxyWidget::style
QWidget::paletteQGraphicsProxyWidget::palette
QWidget::fontQGraphicsProxyWidget::font
QWidget::cursorQGraphicsProxyWidget::cursor嵌入的 widget 覆盖了代理 widget 的光标。代理光标根据鼠标当前所在的嵌入子 widget 而变化。
QWidget::sizeHint()QGraphicsProxyWidget::sizeHint()代理将嵌入 widget 所有的大小提示功能都转发。
QWidget::getContentsMargins()QGraphicsProxyWidget::getContentsMargins()setWidget() 更新一次。
QWidget::windowTitleQGraphicsProxyWidget::windowTitlesetWidget() 更新一次。

注意:QGraphicsScene 将嵌入的 widget 维持在一个特殊状态中,以防止它在 widget 嵌入时干扰其他 widget(包括嵌入和不嵌入的)。在这种状态下,widget 的行为可能与其未嵌入时略有不同。

警告:此类提供用于在 QWidgets 和 QGraphicsItems 之间桥接时的方便,它不应用于高性能场景。特别是,将 widget 嵌入由使用 OpenGL 视口显示的 QGraphicsView 中的场景组合将不会对所有组合工作。

另请参阅:QGraphicsScene::addWidget() 和 QGraphicsWidget

成员类型文档

enum QGraphicsProxyWidget::匿名枚举

由虚拟函数 type() 返回的值。

常量描述
QGraphicsProxyWidget::Type12一个图形代理 widget

成员函数文档

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

使用 parentwFlags 构造一个新的 QGraphicsProxy widget。将 parentwFlags 传递给 QGraphicsItem 的构造函数。

[虚拟 noexcept] QGraphicsProxyWidget::~QGraphicsProxyWidget()

销毁代理小部件以及任何嵌入的小部件。

[重写 虚保护] void QGraphicsProxyWidget::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)

重写: QGraphicsItem::contextMenuEvent(QGraphicsSceneContextMenuEvent *event).

QGraphicsProxyWidget *QGraphicsProxyWidget::createProxyForChildWidget(QWidget *child)

为存储在此代理中的小部件的给定 创建代理小部件。

此函数使得获取非顶层小部件的代理成为可能。例如,您可以嵌入一个对话框,然后仅转换其一个小部件。

如果小部件已经嵌入,则返回现有的代理小部件。

另请参阅newProxyWidget() 和 QGraphicsScene::addWidget().

[重写 虚保护] void QGraphicsProxyWidget::dragEnterEvent(QGraphicsSceneDragDropEvent *event)

重写: QGraphicsItem::dragEnterEvent(QGraphicsSceneDragDropEvent *event).

[重写 虚保护] void QGraphicsProxyWidget::dragLeaveEvent(QGraphicsSceneDragDropEvent *event)

重写: QGraphicsItem::dragLeaveEvent(QGraphicsSceneDragDropEvent *event).

[重写 虚保护] void QGraphicsProxyWidget::dragMoveEvent(QGraphicsSceneDragDropEvent *event)

重写: QGraphicsItem::dragMoveEvent(QGraphicsSceneDragDropEvent *event).

[重写 虚保护] void QGraphicsProxyWidget::dropEvent(QGraphicsSceneDragDropEvent *event)

重写: QGraphicsItem::dropEvent(QGraphicsSceneDragDropEvent *event).

[重写 虚保护] bool QGraphicsProxyWidget::event(QEvent *event)

重写: QGraphicsWidget::event(QEvent *event).

[重写 虚保护] bool QGraphicsProxyWidget::eventFilter(QObject *object, QEvent *event)

重写: QObject::eventFilter(QObject *watched, QEvent *event).

[重写 虚保护] void QGraphicsProxyWidget::focusInEvent(QFocusEvent *event)

重写: QGraphicsWidget::focusInEvent(QFocusEvent *event).

[重写 虚保护] bool QGraphicsProxyWidget::focusNextPrevChild(bool next)

重写: QGraphicsWidget::focusNextPrevChild(bool next).

[重写虚受保护] void QGraphicsProxyWidget::focusOutEvent(QFocusEvent *event)

重实现了: QGraphicsWidget::focusOutEvent(QFocusEvent *event).

[重写虚受保护] void QGraphicsProxyWidget::grabMouseEvent(QEvent *event)

重实现了: QGraphicsWidget::grabMouseEvent(QEvent *event).

[重写虚受保护] void QGraphicsProxyWidget::hideEvent(QHideEvent *event)

重实现了: QGraphicsWidget::hideEvent(QHideEvent *event).

[重写虚受保护] void QGraphicsProxyWidget::hoverEnterEvent(QGraphicsSceneHoverEvent *event)

重实现了: QGraphicsItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event).

[重写虚受保护] void QGraphicsProxyWidget::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)

重实现了: QGraphicsWidget::hoverLeaveEvent(QGraphicsSceneHoverEvent *event).

[重写虚受保护] void QGraphicsProxyWidget::hoverMoveEvent(QGraphicsSceneHoverEvent *event)

重实现了: QGraphicsWidget::hoverMoveEvent(QGraphicsSceneHoverEvent *event).

[重写虚受保护] QVariant QGraphicsProxyWidget::inputMethodEvent(QInputMethodEvent *event)

重实现了: QGraphicsItem::inputMethodEvent(QInputMethodEvent *event).

[重写虚受保护] QVariant QGraphicsProxyWidget::inputMethodQuery(Qt::InputMethodQuery query) const

重实现了: QGraphicsItem::inputMethodQuery(Qt::InputMethodQuery query) const.

[重写虚受保护] QVariant QGraphicsProxyWidget::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value)

重实现了: QGraphicsWidget::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value).

[重写虚受保护] void QGraphicsProxyWidget::keyPressEvent(QKeyEvent *event)

重实现了: QGraphicsItem::keyPressEvent(QKeyEvent *event).

[重写虚受保护] void QGraphicsProxyWidget::keyReleaseEvent(QKeyEvent *event)

重实现了: QGraphicsItem::keyReleaseEvent(QKeyEvent *event).

[重写虚拟受保护] void QGraphicsProxyWidget::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)

重写:QGraphicsItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event).

[重写虚拟受保护] void QGraphicsProxyWidget::mouseMoveEvent(QGraphicsSceneMouseEvent *event)

重写:QGraphicsItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event).

[重写虚拟受保护] void QGraphicsProxyWidget::mousePressEvent(QGraphicsSceneMouseEvent *event)

重写:QGraphicsItem::mousePressEvent(QGraphicsSceneMouseEvent *event).

[重写虚拟受保护] void QGraphicsProxyWidget::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)

重写:QGraphicsItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event).

[受保护槽函数] QGraphicsProxyWidget *QGraphicsProxyWidget::newProxyWidget(const QWidget *child)

为存储在此代理中的小部件的给定 创建代理小部件。

不应直接调用此函数;使用 QGraphicsProxyWidget::createProxyForChildWidget() 代替。

此函数是一个假虚槽,您可以在子类中重写它以控制如何创建新的代理小部件。默认实现使用包含此代理小部件作为父级的 QGraphicsProxyWidget() 构造函数创建代理。

另请参阅createProxyForChildWidget

[重写虚拟] void QGraphicsProxyWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)

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

[重写虚拟受保护] void QGraphicsProxyWidget::resizeEvent(QGraphicsSceneResizeEvent *event)

重写:QGraphicsWidget::resizeEvent(QGraphicsSceneResizeEvent *event).

[重写虚拟] void QGraphicsProxyWidget::setGeometry(const QRectF &rect)

重写:QGraphicsLayoutItem::setGeometry(const QRectF &rect).

void QGraphicsProxyWidget::setWidget(QWidget *widget)

widget 嵌入此代理小部件中。嵌入的小部件必须驻留在图形视图内部或外部。只要它在 UI 中的其他位置可见,您就不能嵌入小部件。

部件必须是一个顶层部件,且其父级是nullptr

当部件嵌入时,其状态(例如,可见性、启用状态、几何形状、尺寸提示)将被复制到代理部件中。如果嵌入的部件被明确隐藏或禁用,代理部件在嵌入完成后也将被明确隐藏或禁用。类文档对该共享状态有一个全面的概述。

QGraphicsProxyWidget的窗口标志决定了嵌入后部件是否会有窗口装饰。

此函数返回后,QGraphicsProxyWidget将尽可能地保持其状态与部件同步。

如果在这个函数被调用之前,此代理已经嵌入了一个部件,那么这个部件将会首先自动卸载。传递widget参数为nullptr只会卸载该部件,并将当前嵌入部件的拥有权传递给调用者。所有嵌入的子部件也会被嵌入,并销毁其代理部件。

注意,设置了Qt::WA_PaintOnScreen部件属性和包装了外部应用程序或控制器的部件无法嵌入。例如,QOpenGLWidget和QAxWidget。

另请参阅widget()。

[重写虚保护] void QGraphicsProxyWidget::showEvent(QShowEvent *event)

重新实现:QGraphicsWidget::showEvent(QShowEvent *event)。

[重写虚保护] QSizeF QGraphicsProxyWidget::sizeHint(Qt::SizeHint which, const QSizeF &constraint = QSizeF()) const

重新实现:QGraphicsWidget::sizeHint(Qt::SizeHint which, const QSizeF &constraint) const

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

此函数返回widget的矩形,它必须是widget()或其子代部件,在此代理项的局部坐标下。

如果没有嵌入部件,widgetnullptr,或者widget不是嵌入部件的子代,则此函数返回一个空的QRectF

另请参阅widget()。

[重写虚] int QGraphicsProxyWidget::type() const

重新实现:QGraphicsWidget::type() const

[重写虚保护] void QGraphicsProxyWidget::ungrabMouseEvent(QEvent *event)

重新实现:QGraphicsWidget::ungrabMouseEvent(QEvent *event)。

[重写虚保护] void QGraphicsProxyWidget::wheelEvent(QGraphicsSceneWheelEvent *event)

重新实现:QGraphicsItem::wheelEvent(QGraphicsSceneWheelEvent *event).

QWidget *QGraphicsProxyWidget::widget() const

返回嵌入小部件的指针。

另请参阅 setWidget().

© 2024 The Qt Company Ltd. 本文档中包含的贡献是各自所有者的版权。提供的文档是根据自由软件基金会发布的 GNU自由文档许可协议版本1.3 的条款许可的。Qt和相应的标志是The Qt Company Ltd.在芬兰和其他国家的商标。所有其他商标均为各自所有者的财产。