Есть ли способ в Pyqtgraph, чтобы установить уровень, например, FillBetweenItem? - PullRequest
0 голосов
/ 25 марта 2020

В моем приложении у меня есть много разных FillBetweenItems от разных типов, и я не хочу удалять каждый раз и строить все элементы снова. Я хотел бы использовать curve1.setData () и curve2.setData (). Для каждого класса я бы хотел установить уровень: например, FillBetweenItem из class1 всегда должен быть поверх FillBetweenItem из class2. В то время как Class3 всегда будет ниже class2. Что-то мне не хватает?

import pyqtgraph as pg

class RedClass:
    def __init__(self, ax = None):
        self.ax = ax
        self.lowerCurve = None
        self.upperCurve = None
        self.fillItem = None
    def draw(self, ax = None):
        pen = pg.mkPen(None)
        if self.lowerCurve is None:
            self.lowerCurve = self.ax.plot([1,2],[1,1], pen = pen)
        else:
            self.lowerCurve.setData(x = [1,2], y =  [1,1])
        if self.upperCurve is None:
            self.upperCurve = self.ax.plot([1,2],[3,3], pen = pen)
        else:
            self.upperCurve.setData(x = [1,2],y =  [3,3])
        if self.fillItem is None:

            self.fillItem = pg.FillBetweenItem(self.lowerCurve, self.upperCurve, brush = pg.mkBrush('r'))
            self.ax.addItem(self.fillItem)
class GreenClass:
    def __init__(self, ax = None):
        self.ax = ax
        self.lowerCurve = None
        self.upperCurve = None
        self.fillItem = None
    def draw(self):
        pen = pg.mkPen(None)
        if self.lowerCurve is None:
            self.lowerCurve = self.ax.plot([1.5,2.5],[1.5,1.5], pen = pen)
        else:
            self.lowerCurve.setData(x =[1.5,2.5], y =  [1.5,1.5])
        if self.upperCurve is None:
            self.upperCurve = self.ax.plot([1.5,2.5],[2.5,2.5], pen = pen)
        else:
            self.upperCurve.setData(x = [1.5,2.5],y = [2.5,2.5])
        if self.fillItem is None:
            self.fillItem = pg.FillBetweenItem(self.lowerCurve, self.upperCurve, brush = pg.mkBrush('g'))
            self.ax.addItem(self.fillItem)


if __name__ == '__main__':
    from PySide2.QtWidgets import QApplication
    import sys
    app = QApplication(sys.argv) 
    ax = pg.PlotWidget()
    greenOne = GreenClass(ax = ax)
    redOne = RedClass(ax = ax)
    #time of draw call determines which class is plotted on top
    redOne.draw()
    greenOne.draw()
    ax.show()
    sys.exit(app.exec_())

Зависит от того, вызову ли я redOne.draw () first или greenOne.draw () first, какой цвет будет отображаться сверху:

enter image description here

Есть ли способ установить, например, уровень, на котором элементы Fillbetween красного класса всегда располагаются поверх зеленых? Или я должен заботиться о каждом предмете?

1 Ответ

1 голос
/ 25 марта 2020

Вы должны установить ZValue: элемент с более высоким ZValue всегда будет перед элементом с более низким ZValue:

# ...
redOne.draw()
greenOne.draw()

<b>greenOne.fillItem.setZValue(0)
redOne.fillItem.setZValue(1)</b>

ax.show()
# ...

enter image description here

...