В конечном итоге я хочу, чтобы pyqtgraph отображал один объект GraphicsObject одновременно в нескольких окнах просмотра, совместно используя одну сцену.
В то же время я хочу, чтобы другие объекты GraphicsObject были только в одном ViewBox.
Примерно так:
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_()
Запуск этого дает мне два ViewBoxes, но только vb0 показывает треугольник. Также этот подход дал бы мне только глобальные предметы. Есть ли способ получить что-то вроде локальных / глобальных элементов без полной перестройки ViewBoxes?
РЕДАКТИРОВАТЬ: Я думаю, что невозможно достичь того, что я хочу с pyqtgraph ViewBoxes. Трансформация глобальных предметов должна произойти как раз перед картиной.