class QGraphicsProxyWidget#

QGraphicsProxyWidget 提供了一个代理层,用于在 QGraphicsScene 中嵌入 QWidget . 更多

Inheritance diagram of PySide6.QtWidgets.QGraphicsProxyWidget

概要#

方法#

槽函数#

  • 定义

注意

本文档可能包含从C++自动翻译到Python的代码片段。我们始终欢迎对代码片段翻译的贡献。如果您发现翻译存在问题,也可以通过在https:/bugreports.qt.io/projects/PYSIDE上创建工单的方式告知我们。

详细描述

警告

本节包含从C++自动翻译到Python的代码片段,可能包含错误。

QGraphicsProxyWidget嵌入基于QWidget的控件,例如QPushButton, QFontComboBox或QFileDialog,并将它们嵌入到QGraphicsScene中。它在两个对象之间传递事件,并在基于整数的QWidget几何形状和基于qreal的QGraphicsWidget几何形状之间进行转换。QGraphicsProxyWidget支持QWidget的几乎所有核心功能,包括标签焦点、键盘输入、拖放和弹出窗口。您还可以嵌入复杂的控件,例如包含子控件的控件。

示例

if __name__ == "__main__":

    app = QApplication([])
    tabWidget = QTabWidget()
    scene = QGraphicsScene()
    proxy = scene.addWidget(tabWidget)
    view = QGraphicsView(scene)
    view.show()
    sys.exit(app.exec())

QGraphicsProxyWidget会自动处理嵌入控件的弹出子窗口,为每个弹出创建一个子代理。这意味着当嵌入的QComboBox显示其弹出列表时,会自动创建一个新的QGraphicsProxyWidget,嵌入弹出窗口并将其正确定位。这仅在弹出是嵌入控件的子项时才有效(例如setMenu()需要将QMenu实例作为QToolButton的子项)。

使用QGraphicsProxyWidget嵌入小工具#

使用QGraphicsProxyWidget嵌入小工具有两种方式。最常见的方式是将小工具的指针传递给addWidget()函数,并带上任何相关的Qt::WindowFlags。这个函数返回一个指向QGraphicsProxyWidget的指针。然后,你可以选择重新定位或对代理或嵌入的小工具进行定位。

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

groupBox = QGroupBox("Contact Details")
numberLabel = QLabel("Telephone number")
numberEdit = QLineEdit()
layout = QFormLayout(groupBox)
layout.addRow(numberLabel, numberEdit)
scene = QGraphicsScene()
proxy = scene.addWidget(groupBox)
view = QGraphicsView(scene)
view.show()

下方的图像是带有内容边距和内容矩形的输出结果。

../../_images/qgraphicsproxywidget-embed.png

或者,你可以先创建一个新的QGraphicsProxyWidget项目,然后调用setWidget()在之后嵌入一个QWidget。函数widget()返回嵌入小工具的指针。QGraphicsProxyWidgetQWidget共享所有权,所以如果两个小工具中的任何一个被销毁,另一个也会自动销毁。

同步小工具状态#

QGraphicsProxyWidget将其状态与小工具同步。例如,如果代理被隐藏或禁用,嵌入的小工具也会隐藏或禁用,反之亦然。当通过调用addWidget()将小工具嵌入时,QGraphicsProxyWidget会从小工具复制状态到代理中,并在可能的情况下保持同步。默认情况下,当你将小工具嵌入到代理时,小工具和代理都将可见,因为QGraphicsWidget在创建时是可见的(不需要调用show())。如果你显式地隐藏嵌入的小工具,代理也将变得不可见。

示例

scene = QGraphicsScene()
edit = QLineEdit()
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 状态

注意

启用

QGraphicsProxyWidget::enabled

可见

QGraphicsProxyWidget::visible

显式状态也是对称的。

几何形状

QGraphicsProxyWidget::geometry

几何形状只有在嵌入的窗口可见时才保证是对称的。

布局方向

QGraphicsProxyWidget::layoutDirection

样式

QGraphicsProxyWidget::style

调色板

QGraphicsProxyWidget::palette

字体

QGraphicsProxyWidget::font

光标

QGraphicsProxyWidget::cursor

嵌入的窗口会覆盖代理窗口的光标。代理窗口的光标会根据当前鼠标下方的嵌入子窗口而变化。

sizeHint()

sizeHint()

将嵌入窗口的所有大小提示功能都通过代理转发。

QWidget::getContentsMargins()

getContentsMargins()

setWidget() 一次性更新。

窗口标题

QGraphicsProxyWidget::windowTitle

setWidget() 一次性更新。

注意

QGraphicsScene 保持嵌入窗口在特殊状态,防止它在嵌入时干扰其他窗口(既有嵌入的,也有非嵌入的)。在这种状态下,窗口可能的行为略有不同。

警告

此类提供于在 QWidgets 和 QGraphicsItems 之间桥接时使用的便利,不应用于高性能场景。特别是,将窗口嵌入到通过使用 OpenGL 视口显示的 QGraphicsView 中的场景可能不适合所有组合。

__init__([parent=None[, wFlags=Qt.WindowFlags()]])#
参数:

构造一个新的 QGraphicsProxy 窗口。将 parentwFlags 传递给 QGraphicsItem 构造函数。

createProxyForChildWidget(child)#
参数:

childQWidget

返回类型:

QGraphicsProxyWidget

为包含在此代理中的 child 小部件创建一个代理小部件。

此功能允许获取非顶级小部件的代理。例如,您可以将一个对话框嵌入,然后仅转换其中的一个小部件。

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

newProxyWidget(arg__1)#
参数:

arg__1QWidget

返回类型:

QGraphicsProxyWidget

为包含在此代理中的 child 小部件创建一个代理小部件。

请不要直接调用此函数;应使用 createProxyForChildWidget() 来代替。

此函数是一个虚拟的假函数槽,您可以在子类中重新实现,以控制新代理小部件的创建方式。默认实现返回一个使用 QGraphicsProxyWidget() 构造函数创建了该代理小部件作为父小部件的代理。

setWidget(widget)#
参数:

widgetQWidget

widget 小部件嵌入到此代理小部件中。嵌入的小部件必须仅存在于 Graphics View 的内部或外部。只要小部件在 UI 中的其他地方可見,您就不能将其嵌入。在同时这样做是不允许的。

widget 必须是一个顶级小部件,其父级为 None

当小部件被嵌入时,其状态(例如可见性、启用状态、几何形状、大小提示)将被复制到代理小部件中。如果显式地将嵌入的小部件隐藏或禁用,则在嵌入完成后,代理小部件也将显式地隐藏或禁用。类文档提供了共享状态的全面概述。

QGraphicsProxyWidget 的窗口标志决定在嵌入后是否给予小部件窗口装饰。

在此函数返回后,只要可能,QGraphicsProxyWidget 将始终保持与 widget 的状态同步。

如果在此函数调用时已经通过此代理嵌入了一个小部件,则首先会自动取消嵌入该小部件。为 widget 参数传递 None 只能取消嵌入小部件,并且当前已嵌入的小部件的所有权将传递给调用者。所有嵌入的子小部件也将被嵌入,它们的代理小部件将被销毁。

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

另请参阅

widget()

subWidgetRect(widget)#
参数:

widgetQWidget

返回类型:

QRectF

返回 widget 的矩形,其中必须为 widget() 的子代或 widget() 本身,以当前代理项的本地坐标系为准。

如果未嵌入小部件,或 widgetNone,或者 widget 不是嵌入小部件的子代,则该函数返回一个空的 QRectF。

另请参阅

widget()

widget()#
返回类型:

QWidget

返回嵌入小部件的指针。

另请参阅

setWidget()