【发布时间】:2019-09-16 21:00:42
【问题描述】:
最终我希望 pyqtgraph 在多个 ViewBox 中同时显示单个 GraphicsObject,共享一个场景。 同时,我只想在一个 ViewBox 中有一些其他的 GraphicsObjects。
类似这样的:
vb0 = ViewBox()
vb1 = ViewBox()
# shown only in first ViewBox vb0
local_item = GraphicsObject()
# shown in all ViewBoxes
global_item = GraphicsObject()
vb0.addItem(local_item)
assert vb0.scene() is vb1.scene()
# the magic function i am looking for
vb0.scene().addItemGlobally(global_item)
所以我非常天真地查看了 ViewBox 源代码并复制了 addItem() 的步骤,如下所示:
import pyqtgraph as pg
from pyqtgraph.Qt import QtCore as qc, QtGui as qg, QtWidgets as qw
class Polygon(pg.GraphicsObject):
"""Just a Triangle..."""
app = qw.QApplication([])
viewer = pg.GraphicsWindow()
vb0 = viewer.addViewBox(0, 0)
vb1 = viewer.addViewBox(0, 1)
viewer.show()
poly_yellow = Polygon((125, 125, 0, 255))
scene = vb0.scene()
added_items = vb1.addedItems = vb0.addedItems
child_group = vb1.childGroup = vb0.childGroup
child_group.setParent(scene)
child_group.itemsChangedListeners.append(vb1)
# here reproducing steps found in addItem()
if scene is not poly_yellow.scene():
scene.addItem(poly_yellow)
poly_yellow.setParentItem(child_group)
added_items.append(poly_yellow)
vb0.updateAutoRange()
# vb1.updateAutoRange()
# checking if ViewBoxes share relevant attributes
assert vb0.scene() is vb1.scene()
assert vb0.scene() is poly_yellow.scene()
assert vb0.addedItems is vb1.addedItems
assert vb0.childGroup is vb1.childGroup
app.exec_()
运行它会给我两个 ViewBox,但只有 vb0 显示三角形。这种方法也会给我全球唯一的项目。有没有办法在不完全重新实现 ViewBoxes 的情况下获得类似本地/全局项目的东西?
编辑: 我认为使用 pyqtgraph ViewBoxes 无法实现我想要的。全局项目的转换必须在绘画之前发生。
【问题讨论】:
标签: python-3.x pyqt5 pyqtgraph