我最终希望pyqtgraph在多个ViewBox中同时显示一个GraphicsObject,共享一个场景。 同时,我只想在一个ViewBox中拥有一些其他GraphicsObject。
类似这样的东西:
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显示了三角形。同样,这种方法将只给我全局项目。有没有办法在不完全重新实现ViewBox的情况下获得本地/全局项?
编辑:我认为使用pyqtgraph ViewBoxes无法实现我想要的功能。全局项目的转换必须在绘画之前进行。
答案 0 :(得分:0)
我发现使用ViewBox很难做到这一点。但是,可以使用pyqtgraphs GraphicsView来实现已经在ViewBox类中找到的许多功能。
我现在的方法是生成所需数量的GraphicsView,并通过GraphicsView.setScene()将它们全部设置为一个场景。
场景包含“全局”项目,显示在每个视图中。使用GraphicsView.drawBackground()函数绘制特定于视图的本地项。
我还没有对其进行太多的测试,但是对于这种情况,将几个thousend项添加到场景中,但在背景中仅绘制了几项,看来效果很好。