- class QGraphicsProxyWidget#
类
QGraphicsProxyWidget
提供了一个代理层,用于在QGraphicsScene
中嵌入QWidget
. 更多…概要#
方法#
def
__init__()
def
setWidget()
def
subWidgetRect()
def
widget()
槽函数#
定义
注意
本文档可能包含从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()
下方的图像是带有内容边距和内容矩形的输出结果。
或者,你可以先创建一个新的
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
状态注意
启用
QGraphicsProxyWidget::enabled
可见
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()]])#
- 参数:
parent –
QGraphicsItem
wFlags –
WindowType
组合
构造一个新的 QGraphicsProxy 窗口。将
parent
和wFlags
传递给QGraphicsItem
构造函数。为包含在此代理中的
child
小部件创建一个代理小部件。此功能允许获取非顶级小部件的代理。例如,您可以将一个对话框嵌入,然后仅转换其中的一个小部件。
如果小部件已经嵌入,则返回现有的代理小部件。
为包含在此代理中的
child
小部件创建一个代理小部件。请不要直接调用此函数;应使用
createProxyForChildWidget()
来代替。此函数是一个虚拟的假函数槽,您可以在子类中重新实现,以控制新代理小部件的创建方式。默认实现返回一个使用
QGraphicsProxyWidget()
构造函数创建了该代理小部件作为父小部件的代理。将
widget
小部件嵌入到此代理小部件中。嵌入的小部件必须仅存在于 Graphics View 的内部或外部。只要小部件在 UI 中的其他地方可見,您就不能将其嵌入。在同时这样做是不允许的。widget
必须是一个顶级小部件,其父级为None
。当小部件被嵌入时,其状态(例如可见性、启用状态、几何形状、大小提示)将被复制到代理小部件中。如果显式地将嵌入的小部件隐藏或禁用,则在嵌入完成后,代理小部件也将显式地隐藏或禁用。类文档提供了共享状态的全面概述。
QGraphicsProxyWidget
的窗口标志决定在嵌入后是否给予小部件窗口装饰。在此函数返回后,只要可能,
QGraphicsProxyWidget
将始终保持与widget
的状态同步。如果在此函数调用时已经通过此代理嵌入了一个小部件,则首先会自动取消嵌入该小部件。为
widget
参数传递None
只能取消嵌入小部件,并且当前已嵌入的小部件的所有权将传递给调用者。所有嵌入的子小部件也将被嵌入,它们的代理小部件将被销毁。请注意,设置了 Qt::WA_PaintOnScreen 小部件属性的小部件和包装外部应用程序或控制器的这个小部件不能嵌入。例如,QOpenGLWidget 和 QAxWidget。
另请参阅
返回
widget
的矩形,其中必须为widget()
的子代或widget()
本身,以当前代理项的本地坐标系为准。如果未嵌入小部件,或
widget
为None
,或者widget
不是嵌入小部件的子代,则该函数返回一个空的 QRectF。另请参阅
返回嵌入小部件的指针。
另请参阅