将GraphicsObject添加到两个ViewBoxes或QGraphicsViews

时间:2019-04-27 17:12:31

标签: python-3.x pyqt5 pyqtgraph

我最终希望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无法实现我想要的功能。全局项目的转换必须在绘画之前进行。

1 个答案:

答案 0 :(得分:0)

我发现使用ViewBox很难做到这一点。但是,可以使用pyqtgraphs GraphicsView来实现已经在ViewBox类中找到的许多功能。

我现在的方法是生成所需数量的GraphicsView,并通过GraphicsView.setScene()将它们全部设置为一个场景。

场景包含“全局”项目,显示在每个视图中。使用GraphicsView.drawBackground()函数绘制特定于视图的本地项。

我还没有对其进行太多的测试,但是对于这种情况,将几个thousend项添加到场景中,但在背景中仅绘制了几项,看来效果很好。