PySide6.QtWidgets.QGraphicsProxyWidget

class QGraphicsProxyWidget

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

PySide6.QtWidgets.QGraphicsProxyWidget 的继承图

概要

方法

插槽

注意

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

详细描述

警告

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

QGraphicsProxyWidget 嵌入了基于 QWidget 的小部件,例如 QPushButtonQFontComboBox,甚至是 QFileDialog,到 QGraphicsScene 中。它在两个对象之间转发事件,并在 QWidget 的基于整数的几何和 QGraphicsWidget 的基于 qreal 的几何之间进行转换。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 状态

备注

enabled

QGraphicsProxyWidget::enabled

visible

QGraphicsProxyWidget::visible

显式状态也是对称的。

geometry

QGraphicsProxyWidget::geometry

仅当嵌入的小部件可见时,几何形状才保证是对称的。

layoutDirection

QGraphicsProxyWidget::layoutDirection

style

QGraphicsProxyWidget::style

palette

QGraphicsProxyWidget::palette

font

QGraphicsProxyWidget::font

cursor

QGraphicsProxyWidget::cursor

嵌入的小部件覆盖了代理小部件的光标。代理光标会根据当前鼠标下的嵌入子部件而变化。

sizeHint()

sizeHint()

嵌入小部件的所有大小提示功能都由代理转发。

QWidget::getContentsMargins()

getContentsMargins()

setWidget() 更新一次。

windowTitle

QGraphicsProxyWidget::windowTitle

setWidget() 更新一次。

注意

QGraphicsScene 将嵌入的小部件保持在一种特殊状态,以防止它在嵌入时干扰其他小部件(无论是嵌入的还是未嵌入的)。在这种状态下,小部件的行为可能与未嵌入时略有不同。

警告

此类是为了方便在QWidgets和QGraphicsItems之间进行桥接而提供的,不应用于高性能场景。特别是,将小部件嵌入到一个场景中,然后通过使用OpenGL视口的QGraphicsView显示的场景,并不适用于所有组合。

__init__([parent=None[, wFlags=Qt.WindowFlags()]])
Parameters:

构造一个新的QGraphicsProxy小部件。parentwFlags被传递给QGraphicsItem的构造函数。

createProxyForChildWidget(child)
Parameters:

子控件QWidget

Return type:

QGraphicsProxyWidget

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

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

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

newProxyWidget(child)
Parameters:

子控件QWidget

Return type:

QGraphicsProxyWidget

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

你不应该直接调用这个函数;请使用createProxyForChildWidget()代替。

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

setWidget(widget)
Parameters:

widgetQWidget

widget嵌入到此代理小部件中。嵌入的小部件必须完全位于图形视图内部或外部。只要小部件在用户界面的其他地方可见,就不能同时将其嵌入。

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

当小部件被嵌入时,其状态(例如,可见、启用、几何形状、大小提示)会被复制到代理小部件中。如果嵌入的小部件被显式隐藏或禁用,代理小部件在嵌入完成后将变为显式隐藏或禁用。类文档中有关于共享状态的完整概述。

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

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

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

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

另请参阅

widget()

subWidgetRect(widget)
Parameters:

widgetQWidget

Return type:

QRectF

返回widget的矩形,该widget必须是widget()的后代,或者是widget()本身,在此代理项的本地区域坐标中。

如果没有嵌入小部件,widgetNone,或者 widget 不是嵌入小部件的后代,此函数返回一个空的 QRectF。

另请参阅

widget()

widget()
Return type:

QWidget

返回指向嵌入小部件的指针。

另请参阅

setWidget()