class DraggedLineItem(QGraphicsPathItem): def __init__(self, p0, p1, parent=None): QGraphicsPathItem.__init__(self, parent=parent) self._p0 = p0 self._p1 = p1 self._startPoint = QGraphicsEllipseItem(-3, -3, 6, 6, parent=self) self._startPoint.setPos(p0) self._endPoint = QGraphicsEllipseItem(-3, -3, 6, 6, parent=self) self._endPoint.setVisible(False) brush = QBrush(QColor(Qt.black)) self._startPoint.setBrush(brush) self._endPoint.setBrush(brush) pen = QPen(brush, 2.0) self.setPen(pen) def showEndpoint(self, show): self._endPoint.setVisible(show) def setEndpoint(self, pos): self._p1 = pos self._endPoint.setPos(pos) self._updatePath() def _updatePath(self): p0 = self._p0 p1 = self._p1 path = QPainterPath() path.moveTo(p0) dx = p1.x() - p0.x() x0 = p0.x() + 0.7 * dx x1 = p1.x() - 0.7 * dx path.cubicTo(QPointF(x0, p0.y()), QPointF(x1, p1.y()), p1) self.setPath(path)
class AxisScene(QGraphicsScene): def __init__(self, parent = None): super(AxisScene, self).__init__(parent) self.guidePen = QPen(QColor("blue"),1) self.dot = QGraphicsEllipseItem(-10, -10, 20, 20) self.dot.setPos(QPointF(0,0)) self.dot.setPen(QPen(QColor("red"), 4)) self.dot.setBrush(QColor("black")) self.lastPos = {} self.lastPos['x'] = 0 self.lastPos['y'] = 0 self.grid = False self.gridPen = QPen(QColor("blue"), 2) self.pathItem = QGraphicsPathItem() self.pathItem.setPen(QPen(QColor("red"), 1, Qt.DotLine)) self.path = None self.xAxis = "Select Axis..." self.yAxis = self.xAxis self.addItem(self.dot) def setXAxisName(self, x): self.xAxis = "Axis " + str(x) self.invalidate() def setYAxisName(self, y): self.yAxis = "Axis " + str(y) self.invalidate() def pathToggled(self, toggled): if toggled: self.path = QPainterPath() self.path.moveTo(0,0) self.pathItem.setPath(self.path) self.addItem(self.pathItem) else: if self.path != None: self.removeItem(self.pathItem) self.path = None self.invalidate() def gridToggled(self, toggled): self.grid = toggled self.invalidate() def updateDotX(self, x): self.lastPos['x'] = x * (self.sceneRect().width() / 2) self.update(self.lastPos['x'], self.lastPos['y']) def updateDotY(self, y): self.lastPos['y'] = y * (self.sceneRect().height() / 2) self.update(self.lastPos['x'], self.lastPos['y']) def update(self, x, y): if self.path != None: self.path.lineTo(x, y) self.pathItem.setPath(self.path) self.dot.setPos(self.lastPos['x'], self.lastPos['y']) self.invalidate() def drawBackground(self, painter, rect): if self.grid: painter.setClipRect(rect) painter.setPen(self.gridPen) def drawForeground(self, painter, rect): painter.setClipRect(rect) painter.setPen(self.gridPen) r = self.sceneRect() if self.grid: painter.drawLine(r.center().x(), r.top(), r.center().x(), r.bottom()) painter.drawLine(r.left(), r.center().y(), r.right(), r.center().y()) painter.setPen(QPen(QColor("red"), 1)) painter.drawText(QRectF(r.left(), r.center().y(), 80, 80), self.xAxis) painter.drawText(QRectF(r.center().x()+5, r.top(), 80, 80), self.yAxis) if self.path != None: painter.setPen(QPen(QColor("red"), 1)) painter.drawLine(QPointF(self.lastPos['x'], r.top()), QPointF(self.lastPos['x'], r.bottom())) painter.drawLine(QPointF(r.left(), self.lastPos['y']), QPointF(r.right(), self.lastPos['y']))