def updatePaintNode(self, oldNode: QSGGeometryNode, _): if oldNode == None: node = QSGGeometryNode() geometry = QSGGeometry(QSGGeometry.defaultAttributes_Point2D(), self._segment_count) geometry.setLineWidth(3) geometry.setDrawingMode(QSGGeometry.DrawLineStrip) node.setGeometry(geometry) node.setFlag(QSGNode.OwnsGeometry) material = QSGFlatColorMaterial() material.setColor(QColor(45, 100, 120)) node.setMaterial(material) node.setFlag(QSGNode.OwnsMaterial) else: node = oldNode geometry = node.geometry() geometry.allocate(self._segment_count) itemSize = self.size() vertices = geometry.vertexDataAsPoint2D() x1 = self._p1.x() y1 = self._p1.y() vertices[0].set(x1, y1) x2 = self._p2.x() y2 = self._p2.y() vertices[1].set(x2, y2) print(vertices[1].x) node.markDirty(QSGNode.DirtyGeometry) return node
class BezierCurve(QQuickItem): p1Changed = pyqtSignal(QPointF) @pyqtProperty(QPointF, notify=p1Changed) def p1(self): return self._p1 @p1.setter def p1(self, p): if self._p1 != p: self._p1 = QPointF(p) self.p1Changed.emit(p) self.update() p2Changed = pyqtSignal(QPointF) @pyqtProperty(QPointF, notify=p2Changed) def p2(self): return self._p2 @p2.setter def p2(self, p): if self._p2 != p: self._p2 = QPointF(p) self.p2Changed.emit(p) self.update() p3Changed = pyqtSignal(QPointF) @pyqtProperty(QPointF, notify=p3Changed) def p3(self): return self._p3 @p3.setter def p3(self, p): if self._p3 != p: self._p3 = QPointF(p) self.p3Changed.emit(p) self.update() p4Changed = pyqtSignal(QPointF) @pyqtProperty(QPointF, notify=p4Changed) def p4(self): return self._p4 @p4.setter def p4(self, p): if self._p4 != p: self._p4 = QPointF(p) self.p4Changed.emit(p) self.update() segmentCountChanged = pyqtSignal(int) @pyqtProperty(int, notify=segmentCountChanged) def segmentCount(self): return self._segmentCount @segmentCount.setter def segmentCount(self, count): if self._segmentCount != count: self._segmentCount = count self.segmentCountChanged.emit(count) self.update() def __init__(self, parent=None): super(BezierCurve, self).__init__(parent) self._p1 = QPointF(0, 0) self._p2 = QPointF(1, 0) self._p3 = QPointF(0, 1) self._p4 = QPointF(1, 1) self._segmentCount = 32 self._root_node = None self.setFlag(QQuickItem.ItemHasContents, True) def updatePaintNode(self, oldNode, nodeData): if self._root_node is None: self._root_node = QSGGeometryNode() geometry = QSGGeometry(QSGGeometry.defaultAttributes_Point2D(), self._segmentCount) geometry.setLineWidth(2) geometry.setDrawingMode(QSGGeometry.GL_LINE_STRIP) self._root_node.setGeometry(geometry) self._root_node.setFlag(QSGNode.OwnsGeometry) material = QSGFlatColorMaterial() material.setColor(QColor(255, 0, 0)) self._root_node.setMaterial(material) self._root_node.setFlag(QSGNode.OwnsMaterial) else: geometry = self._root_node.geometry() geometry.allocate(self._segmentCount) w = self.width() h = self.height() vertices = geometry.vertexDataAsPoint2D() for i in range(self._segmentCount): t = i / float(self._segmentCount - 1) invt = 1 - t pos = invt * invt * invt * self._p1 \ + 3 * invt * invt * t * self._p2 \ + 3 * invt * t * t * self._p3 \ + t * t * t * self._p4 vertices[i].set(pos.x() * w, pos.y() * h) self._root_node.markDirty(QSGNode.DirtyGeometry) return self._root_node
class BezierCurve(QQuickItem): # Signals p1_changed = pyqtSignal('QPointF') p2_changed = pyqtSignal('QPointF') p3_changed = pyqtSignal('QPointF') p4_changed = pyqtSignal('QPointF') segment_count_changed = pyqtSignal(int) #Properties @pyqtProperty(QPointF, notify=p1_changed) def p1(self): return self.m_p1 @p1.setter def p1(self, p): if self.m_p1 != p: self.m_p1 = p self.p1_changed.emit(p) self.update() @pyqtProperty(QPointF, notify=p2_changed) def p2(self): return self.m_p2 @p2.setter def p2(self, p): if self.m_p2 != p: self.m_p2 = p self.p2_changed.emit(p) self.update() @pyqtProperty(QPointF, notify=p3_changed) def p3(self): return self.m_p3 @p3.setter def p3(self, p): if self.m_p3 != p: self.m_p3 = p self.p3_changed.emit(p) self.update() @pyqtProperty(QPointF, notify=p4_changed) def p4(self): return self.m_p4 @p4.setter def p4(self, p): if self.m_p4 != p: self.m_p4 = p self.p4_changed.emit(p) self.update() @pyqtProperty(int, notify=segment_count_changed) def segment_count(self): return self.m_segment_count @segment_count.setter def segment_count(self, s): if self.m_segment_count != s: self.m_segment_count = s self.segment_count_changed.emit(s) self.update() def __init__(self, parent=None): super().__init__(parent=parent) self.m_p1 = QPointF(0, 0) self.m_p2 = QPointF(1, 0) self.m_p3 = QPointF(0, 1) self.m_p4 = QPointF(1, 1) self.m_segment_count = 16 self.setFlag(QQuickItem.ItemHasContents, True) self.node = None def updatePaintNode(self, old_node, _): if not old_node: self.node = QSGGeometryNode() geometry = QSGGeometry(QSGGeometry.defaultAttributes_Point2D(), self.m_segment_count) geometry.setLineWidth(2) geometry.setDrawingMode(QSGGeometry.DrawLineStrip) self.node.setGeometry(geometry) self.node.setFlag(QSGNode.OwnsGeometry) material = QSGFlatColorMaterial() material.setColor(QColor(255, 0, 0)) self.node.setMaterial(material) self.node.setFlag(QSGNode.OwnsMaterial) else: geometry = self.node.geometry() geometry.allocate(self.m_segment_count) w = self.width() h = self.height() vertices = geometry.vertexDataAsPoint2D() for i in range(self.m_segment_count): t = i / (self.m_segment_count - 1) invt = 1 - t pos = invt * invt * invt * self.m_p1 \ + 3 * invt * invt * t * self.m_p2 \ + 3 * invt * t * t * self.m_p3 \ + t * t * t * self.m_p4 vertices[i].set(pos.x() * w, pos.y() * h) self.node.markDirty(QSGNode.DirtyGeometry) return self.node
class BezierCurve(QQuickItem): p1Changed = pyqtSignal(QPointF) @pyqtProperty(QPointF, notify=p1Changed) def p1(self): return self._p1 @p1.setter def p1(self, p): if self._p1 != p: self._p1 = QPointF(p) self.p1Changed.emit(p) self.update() p2Changed = pyqtSignal(QPointF) @pyqtProperty(QPointF, notify=p2Changed) def p2(self): return self._p2 @p2.setter def p2(self, p): if self._p2 != p: self._p2 = QPointF(p) self.p2Changed.emit(p) self.update() p3Changed = pyqtSignal(QPointF) @pyqtProperty(QPointF, notify=p3Changed) def p3(self): return self._p3 @p3.setter def p3(self, p): if self._p3 != p: self._p3 = QPointF(p) self.p3Changed.emit(p) self.update() p4Changed = pyqtSignal(QPointF) @pyqtProperty(QPointF, notify=p4Changed) def p4(self): return self._p4 @p4.setter def p4(self, p): if self._p4 != p: self._p4 = QPointF(p) self.p4Changed.emit(p) self.update() segmentCountChanged = pyqtSignal(int) @pyqtProperty(int, notify=segmentCountChanged) def segmentCount(self): return self._segmentCount @segmentCount.setter def segmentCount(self, count): if self._segmentCount != count: self._segmentCount = count self.segmentCountChanged.emit(count) self.update() def __init__(self, parent=None): super(BezierCurve, self).__init__(parent) self._p1 = QPointF(0, 0) self._p2 = QPointF(1, 0) self._p3 = QPointF(0, 1) self._p4 = QPointF(1, 1) self._segmentCount = 32 self._root_node = None self.setFlag(QQuickItem.ItemHasContents, True) def updatePaintNode(self, oldNode, nodeData): if self._root_node is None: self._root_node = QSGGeometryNode() geometry = QSGGeometry(QSGGeometry.defaultAttributes_Point2D(), self._segmentCount) geometry.setLineWidth(2) geometry.setDrawingMode(QSGGeometry.GL_LINE_STRIP) self._root_node.setGeometry(geometry) self._root_node.setFlag(QSGNode.OwnsGeometry) material = QSGFlatColorMaterial() material.setColor(QColor(255, 0, 0)) self._root_node.setMaterial(material) self._root_node.setFlag(QSGNode.OwnsMaterial) else: geometry = self._root_node.geometry() geometry.allocate(self._segmentCount) w = self.width() h = self.height() vertices = geometry.vertexDataAsPoint2D() for i in range(self._segmentCount): t = i / float(self._segmentCount - 1) invt = 1 - t pos = invt * invt * invt * self._p1 \ + 3 * invt * invt * t * self._p2 \ + 3 * invt * t * t * self._p3 \ + t * t * t * self._p4 vertices[i].set(pos.x() * w, pos.y() * h) self._root_node.markDirty(QSGNode.DirtyGeometry) return self._root_node