I am developing a plugin in QGIS 3.14 to customize editing. I am drawing a line by clicking on map canvas. It is showing points with mouse click and creating a line with right click. I want to trace mouse by showing dotted line while generating points. Just like existing 'Add Line Feature' function of 'Toggle Editing' in QGIS. Following is the code which I am using now.

<!-- language: python -->

	class StraightLine(QgsMapToolEmitPoint):
		points = []

		def __init__(self, canvas):
			# call the parent constructor
			QgsMapToolEmitPoint.__init__(self, canvas)
			# store the passed canvas
			self.canvas = canvas

			# flag to know whether the tool is performing a drawing operation 
			self.isDrawing = False
			self.dlg = CurveToolDialog()
			# create and setup the rubber band to display the line
			self.rubberBand = QgsRubberBand(iface.mapCanvas(), QgsWkbTypes.LineGeometry)  
			self.rubberBand.setColor(Qt.red)
			self.rubberBand.setWidth(1)
			self.dlg.setFocusPolicy(Qt.StrongFocus) 

		def clear(self):
			self.rubberBand.reset(False)    # False = not a polygon = a line

		def delete(self):
			self.canvas.scene().removeItem(self.rubberBand)
		
		def canvasPressEvent(self, e):
			# which the mouse button?
			if e.button() == Qt.LeftButton:
				# left click
				# if it's the first left click, clear the rubberband 
				if not self.isDrawing:
					self.clear()
					self.points = []
				# we are drawing now
				self.isDrawing = True
				point = self.toMapCoordinates(e.pos())
				# add a new point to the rubber band
				self.rubberBand.addPoint(point, True)    # True = display updates on the canvas
				self.points.append(QgsPoint(point))
				polyline = QgsGeometry.fromPolyline(self.points)
				feat = QgsFeature()
				feat.setGeometry(polyline)            
				self.rubberBand.setToGeometry(polyline)
				self.rubberBand.movePoint(point)
				self.rubberBand.show()
				# and finally show the rubber band
				self.rubberBand.show()
				
			if e.button() == Qt.RightButton:
				
				# right click, stop drawing
				self.isDrawing = False
				# emit a signal
				polyline = QgsGeometry.fromPolyline(self.points)
				feat = QgsFeature()
				feat.setGeometry(polyline)            
				self.rubberBand.setToGeometry(polyline)
				self.rubberBand.show()  
				layer = iface.activeLayer()
				f = layer.getFeature(0)
				prov1 = layer.dataProvider()
				layer.startEditing()
				prov1.addFeatures([feat])
				feat.setAttributes(f.attributes())
				layer.commitChanges()
				layer.updateExtents()
				iface.mapCanvas().refresh()  
				self.dlg.open()
			   
		def geometry(self):
			return self.rubberBand.asGeometry() 


I tried adding following function which uses painter, but it doesn't make any change in working of the tool.

<!-- language: python -->

    def mouseMoveEvent(self, event):
        if self.last:
            self.painter.drawLine(self.last, event.pos())
            self.last = event.pos()
            self.update()