PySide6.QtWidgets.QGraphicsProxyWidget¶
- class QGraphicsProxyWidget¶
QGraphicsProxyWidget
类提供了一个代理层,用于在QGraphicsScene
中嵌入一个QWidget
。更多…概要¶
方法¶
def
__init__()
def
setWidget()
def
subWidgetRect()
def
widget()
插槽¶
def
newProxyWidget()
注意
本文档可能包含从C++自动翻译到Python的代码片段。我们始终欢迎对代码片段翻译的贡献。如果您发现翻译问题,您也可以通过在我们的https:/bugreports.qt.io/projects/PYSIDE上创建工单来告知我们。
详细描述¶
警告
本节包含从C++自动翻译到Python的代码片段,可能包含错误。
QGraphicsProxyWidget
嵌入了基于QWidget
的小部件,例如QPushButton
、QFontComboBox
,甚至是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()
下图是带有内容边距和内容矩形标记的输出结果。
或者,你可以先创建一个新的
QGraphicsProxyWidget
项,然后调用setWidget()
来嵌入一个QWidget
。函数widget()
返回一个指向嵌入小部件的指针。QGraphicsProxyWidget
与QWidget
共享所有权,因此如果两个小部件中的任何一个被销毁,另一个小部件也会自动被销毁。同步小部件状态¶
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
状态备注
enabled
QGraphicsProxyWidget::enabled
visible
QGraphicsProxyWidget::visible
显式状态也是对称的。
QGraphicsProxyWidget::geometry
仅当嵌入的小部件可见时,几何形状才保证是对称的。
QGraphicsProxyWidget::layoutDirection
QGraphicsProxyWidget::style
QGraphicsProxyWidget::palette
QGraphicsProxyWidget::font
QGraphicsProxyWidget::cursor
嵌入的小部件覆盖了代理小部件的光标。代理光标会根据当前鼠标下的嵌入子部件而变化。
sizeHint()
嵌入小部件的所有大小提示功能都由代理转发。
QWidget::getContentsMargins()
getContentsMargins()
由
setWidget()
更新一次。QGraphicsProxyWidget::windowTitle
由
setWidget()
更新一次。注意
QGraphicsScene
将嵌入的小部件保持在一种特殊状态,以防止它在嵌入时干扰其他小部件(无论是嵌入的还是未嵌入的)。在这种状态下,小部件的行为可能与未嵌入时略有不同。警告
此类是为了方便在QWidgets和QGraphicsItems之间进行桥接而提供的,不应用于高性能场景。特别是,将小部件嵌入到一个场景中,然后通过使用OpenGL视口的
QGraphicsView
显示的场景,并不适用于所有组合。- __init__([parent=None[, wFlags=Qt.WindowFlags()]])¶
- Parameters:
parent –
QGraphicsItem
wFlags –
WindowType
的组合
构造一个新的QGraphicsProxy小部件。
parent
和wFlags
被传递给QGraphicsItem
的构造函数。为包含在此代理中的小部件的给定
child
创建一个代理小部件。此函数使得获取非顶级小部件的代理成为可能。例如,您可以嵌入一个对话框,然后仅转换其中的一个小部件。
如果小部件已经嵌入,则返回现有的代理小部件。
为包含在此代理中的小部件的给定
child
创建一个代理小部件。你不应该直接调用这个函数;请使用
createProxyForChildWidget()
代替。此函数是一个假的虚拟槽,您可以在子类中重新实现它,以控制如何创建新的代理小部件。默认实现返回使用
QGraphicsProxyWidget()
构造函数创建的代理,并将此代理小部件作为父级。将
widget
嵌入到此代理小部件中。嵌入的小部件必须完全位于图形视图内部或外部。只要小部件在用户界面的其他地方可见,就不能同时将其嵌入。widget
必须是一个顶级小部件,其父级为None
。当小部件被嵌入时,其状态(例如,可见、启用、几何形状、大小提示)会被复制到代理小部件中。如果嵌入的小部件被显式隐藏或禁用,代理小部件在嵌入完成后将变为显式隐藏或禁用。类文档中有关于共享状态的完整概述。
QGraphicsProxyWidget
的窗口标志决定了嵌入后的小部件是否会有窗口装饰。此函数返回后,
QGraphicsProxyWidget
将尽可能保持其状态与widget
的状态同步。如果在调用此函数时已经通过此代理嵌入了一个小部件,那么该小部件将首先自动取消嵌入。为
widget
参数传递None
只会取消嵌入小部件,并且当前嵌入的小部件的所有权将传递给调用者。每个嵌入的子小部件也将被嵌入,并且它们的代理小部件将被销毁。请注意,设置了Qt::WA_PaintOnScreen小部件属性的小部件以及包装外部应用程序或控制器的小部件无法嵌入。例如QOpenGLWidget和QAxWidget。
另请参阅
返回
widget
的矩形,该widget
必须是widget()
的后代,或者是widget()
本身,在此代理项的本地区域坐标中。如果没有嵌入小部件,
widget
是None
,或者widget
不是嵌入小部件的后代,此函数返回一个空的 QRectF。另请参阅
返回指向嵌入小部件的指针。
另请参阅