Добавление GraphicsObject в два ViewBoxes или QGraphicsViews - PullRequest
1 голос
/ 27 апреля 2019

В конечном итоге я хочу, чтобы 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. Трансформация глобальных предметов должна произойти как раз перед картиной.

1 Ответ

0 голосов
/ 08 мая 2019

Я обнаружил, что это нелегко сделать с помощью ViewBox. Тем не менее, мы можем использовать pyqtgraphs GraphicsView, реализуя множество функциональных возможностей, уже найденных в классе ViewBox.

Мой подход теперь состоит в том, чтобы генерировать столько GraphicsView, сколько мне нужно, и устанавливать их все в одну сцену с помощью GraphicsView.setScene ()

Сцена содержит «глобальные» элементы, отображаемые в каждом представлении. Специфичные для Views локальные элементы отрисовываются с использованием функции GraphicsView.drawBackground ().

Я не слишком много тестировал его, но, похоже, он неплохо работает, для случая, когда на сцену добавлено несколько тысяч элементов, но на задний план выводятся только несколько элементов.

...