График не верно выводит текст (pyqtgraph)

Выручайте уже 3-й день бьюсь над проблемой.

Суть проблемы

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

import pyqtgraph as pg
from pyqtgraph import QtCore, QtGui
from DATA import inf

class CandlestickItem (pg.GraphicsObject):
    def __init__(self):
       pg.GraphicsObject.__init__(self)

    def set_data(self, line):
       self.line = line
       self.generate_picture_line_order()
       self.informViewBoundsChanged()

    def generate_picture_line_order(self):
       self.picture = QtGui.QPicture()
       p = QtGui.QPainter(self.picture)
       for line in self.line:
           if line > inf['ticket_price']:
                p.setPen(pg.mkPen('#CE1212', width=0.7, style=QtCore.Qt.DashLine))
           else:
                p.setPen(pg.mkPen('#32B70A', width=0.7, style=QtCore.Qt.DashLine))
           p.drawLine(QtCore.QPointF(570, line), QtCore.QPointF(605, line))
           p.setPen(pg.mkPen('#BDB76B', width=0.7))
           text = QtGui.QStaticText()
           text.setText(str(line))
           p.drawStaticText(605, line, text)
       p.end()


    def paint(self, p, *args):
         p.drawPicture(0, 0, self.picture)


    def boundingRect(self):
        return QtCore.QRectF(self.picture.boundingRect())

Вот пример который я накидал чтобы просто запустить и погонять в отладчике. Но тут еще интереснее получается, если включить вывод текста то вообще программа не стартует.

 import pyqtgraph as pg
 from pyqtgraph import QtCore, QtGui


 class CandlestickItem (pg.GraphicsObject):
     def __init__(self):
        pg.GraphicsObject.__init__(self)
        self.generate_picture_line_order()
        self.informViewBoundsChanged()

     def generate_picture_line_order(self):
        self.picture = QtGui.QPicture()
        p = QtGui.QPainter(self.picture)
        p.setPen(pg.mkPen('#CE1212', width=0.7, style=QtCore.Qt.DashLine))
        p.drawLine(QtCore.QPointF(0, 50), QtCore.QPointF(50, 50))
        p.setPen(pg.mkPen('#BDB76B', width=0.7))
        text = QtGui.QStaticText()
        text.setText('Text')
        #p.drawStaticText(51, 50, text)  # Здесь проблема!
        p.end()

    def paint(self, p, *args):
        p.drawPicture(0, 0, self.picture)

    def boundingRect(self):
        return QtCore.QRectF(self.picture.boundingRect())

 item = CandlestickItem()
 plt = pg.plot()
 plt.addItem(item)
 plt.setWindowTitle('pyqtgraph example: customGraphicsItem')
 QtGui.QApplication.instance().exec_()

Еще параллельно вопрос к знатокам. Как в pyqtgraph сделать такое

сделать так,

через AxisItem? или можно просто добавить?

И еще один если все подписать как textItem, не используя drawText, который не работает. Это придется для каждой надписи создавать свой итем? или можно просто все впихать в один.

В общем уже кучу форумов перерыл и в официальной документации к pyqtgraph толком нечего отвечающего на мой вопрос нет. Может кто работал с этим инструментом. Заранее спасибо за помощь!


Ответы (1 шт):

Автор решения: S. Nick

Как вариант:

import sys
from pyqtgraph import QtCore, QtGui
import pyqtgraph as pg


class CandlestickItem (pg.GraphicsObject):
    def __init__(self):
        pg.GraphicsObject.__init__(self)
        self.generate_picture_line_order()
        self.informViewBoundsChanged()

    def generate_picture_line_order(self):
        self.picture = QtGui.QPicture()
        p = QtGui.QPainter(self.picture)
        p.setPen(pg.mkPen('#CE1212', width=0.7, style=QtCore.Qt.DashLine))
        p.drawLine(QtCore.QPointF(0, 50), QtCore.QPointF(50, 50))

        p.setPen(pg.mkPen('#BDB76B', width=0.7))
        text = QtGui.QStaticText()
        text.setText('Text')
        p.drawStaticText(51, 50, text)                                              # !!!
        p.end()

    def paint(self, p, *args):
        p.drawPicture(0, 0, self.picture)

    def boundingRect(self):
        return QtCore.QRectF(self.picture.boundingRect())


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)                     # Это первое что вы должны сделать !
    
    # Добавить элемент графика для отображения меток осей ...
    plot = pg.PlotItem()                                               # PlotItem
    plot.setLabel(axis='left', text='Y-axis')
    plot.setLabel(axis='bottom', text='X-axis')
    plot.setTitle('PyQtGraph example: drawStaticText')
    plot.showGrid(x=True,y=True)
    
    item = CandlestickItem()

    imv = pg.ImageView(view=plot)
    vbox = imv.getView()
    vbox.addItem(item)
    vbox.addItem(pg.LabelItem("This is a nice label"))
    imv.show()

    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка