0

I tried to create a 2D plot using QGraphicsItem, I was successful in doing that but when I drag the QGraphicsItem there is a delay and the view is distorted.

enter image description here

Searching for a solution, I came across this QGraphicsItem paint delay. I applied the mouseMoveEvent to my QGraphicsView but it did not resolve the problem.

Could someone tell me what is causing the problem and how can I fix it?

Here is my code:

from PyQt4 import QtGui, QtCore
import sys
import numpy as np

class MyGraphicsItem(QtGui.QGraphicsItem):

    def __init__(self,dataX,dataY):
        super(MyGraphicsItem,self).__init__()
        self.Xval = dataX
        self.Yval = dataY
        self.Xvalmin = np.min(self.Xval)
        self.Xvalmax = np.max(self.Xval)
        self.Yvalmin = np.min(self.Yval)
        self.Yvalmax = np.max(self.Yval)
        self.rect = QtCore.QRectF(0,0,100,2)
        self.points = []
        self._picture = None

    def paint(self, QPainter, QStyleOptionGraphicsItem, QWidget_widget=None):
        if self._picture is None:
            self._picture = QtGui.QPicture()
            QPainter.begin(self._picture)
            startPoint = QtCore.QPointF(0, 0)
            cubicPath = QtGui.QPainterPath()
            cubicPath.moveTo(startPoint)

            for i in range(len(self.points) - 2):
                points_ = self.points[i:i+3]
                cubicPath.cubicTo(*points_)

            QPainter.setPen(QtGui.QPen(QtCore.Qt.red))
            QPainter.drawLine(0,10,100,10)
            QPainter.drawLine(0,-10,0,10)
            QPainter.setPen(QtGui.QPen(QtCore.Qt.black))
            QPainter.drawPath(cubicPath)
            QPainter.end()
        else:
            self._picture.play(QPainter)


    def boundingRect(self):
        return self.rect


class mygraphicsview(QtGui.QGraphicsView):

    def __init__(self):
        super(mygraphicsview,self).__init__()

    def mouseMoveEvent(self, event):
        QtGui.QGraphicsView.mouseMoveEvent(self,event)
        if self.scene().selectedItems():
            self.update()


class Mainwindow(QtGui.QMainWindow):

    def __init__(self):
        super(Mainwindow,self).__init__()
        self.main_widget = QtGui.QWidget()
        self.vl = QtGui.QVBoxLayout()
        self.scene = QtGui.QGraphicsScene()
        self.view = mygraphicsview()

        self.Xval = np.linspace(0,100,1000)
        self.Yval = np.sin(self.Xval)

        self.painter = QtGui.QPainter()
        self.style = QtGui.QStyleOptionGraphicsItem()
        self.item = MyGraphicsItem(self.Xval, self.Yval)
        self.item.paint(self.painter, self.style,self.main_widget)

        self.item.setFlag(QtGui.QGraphicsItem.ItemIsMovable,True)
        self.trans = QtGui.QTransform()
        self.trans.scale(5,5)
        self.item.setTransform(self.trans)
        self.scene = QtGui.QGraphicsScene()
        self.scene.addItem(self.item)

        self.view.setScene(self.scene)
        self.vl.addWidget(self.view)
        self.main_widget.setLayout(self.vl)
        self.setCentralWidget(self.main_widget)

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    window = Mainwindow()
    window.show()
    sys.exit(app.exec_())
Bow
  • 445
  • 1
  • 6
  • 17

1 Answers1

0

I fixed the issue of dragging delay.

The reason for the occurrence of such a delay is due to the boundinRect() function. The boudingRect was too tight around the item designed.

Adding some marigin to the boundingRect(), solved the problem.

self.rect = QtCore.QRectF(-10,-10,120,25)
Bow
  • 445
  • 1
  • 6
  • 17