class_docstr: Class representing a single plot curve. Instances of this class are created
  automatically as part of :class:`PlotDataItem <pyqtgraph.PlotDataItem>`; 
  these rarely need to be instantiated directly.
  
  Features:
  
    - Fast data update
    - Fill under curve
    - Mouse interaction
  
  =====================  ===============================================
  **Signals:**
  sigPlotChanged(self)   Emitted when the data being plotted has changed
  sigClicked(self, ev)   Emitted when the curve is clicked
  =====================  ===============================================
class_docstr_tok: ["Class","representing","a","single","plot","curve",".","Instances","of","this","class","are","created","automatically","as","part","of",":","class",":","`","PlotDataItem","<","pyqtgraph.PlotDataItem",">","`",";","these","rarely","need","to","be","instantiated","directly",".","Features",":","-","Fast","data","update","-","Fill","under","curve","-","Mouse","interaction","=====================","===============================================","*","*","Signals",":","*","*","sigPlotChanged","(","self",")","Emitted","when","the","data","being","plotted","has","changed","sigClicked","(","self",",","ev",")","Emitted","when","the","curve","is","clicked","=====================","==============================================="]
code: def paint(self, p, opt, widget):
      profiler = debug.Profiler()
      if self.xData is None or len(self.xData) == 0:
          return
  
      if getConfigOption("enableExperimental"):
          if HAVE_OPENGL and isinstance(
              widget, QtWidgets.QOpenGLWidget
          ):
              self.paintGL(p, opt, widget)
              return
  
      if self._exportOpts is not False:
          aa = self._exportOpts.get("antialias", True)
      else:
          aa = self.opts["antialias"]
  
      p.setRenderHint(p.RenderHint.Antialiasing, aa)
  
      cmode = self.opts["compositionMode"]
      if cmode is not None:
          p.setCompositionMode(cmode)
  
      do_fill = (
          self.opts["brush"] is not None
          and self.opts["fillLevel"] is not None
      )
      do_fill_outline = do_fill and self.opts["fillOutline"]
  
      if do_fill:
          if self._shouldUseFillPathList():
              paths = self._getFillPathList(widget)
          else:
              paths = [self._getFillPath()]
  
          profiler("generate fill path")
          for path in paths:
              p.fillPath(path, self.opts["brush"])
          profiler("draw fill path")
  
      # Avoid constructing a shadow pen if it's not used.
      if self.opts.get("shadowPen") is not None:
          if isinstance(self.opts.get("shadowPen"), QtGui.QPen):
              sp = self.opts["shadowPen"]
          else:
              sp = fn.mkPen(self.opts["shadowPen"])
  
          if sp.style() != QtCore.Qt.PenStyle.NoPen:
              p.setPen(sp)
              if self._shouldUseDrawLineSegments(sp):
                  p.drawLines(*self._getLineSegments())
                  if do_fill_outline:
                      p.drawLines(self._getClosingSegments())
              else:
                  if do_fill_outline:
                      p.drawPath(self._getFillPath())
                  else:
                      p.drawPath(self.getPath())
  
      cp = self.opts["pen"]
      if not isinstance(cp, QtGui.QPen):
          cp = fn.mkPen(cp)
  
      p.setPen(cp)
      if self._shouldUseDrawLineSegments(cp):
          p.drawLines(*self._getLineSegments())
          if do_fill_outline:
              p.drawLines(self._getClosingSegments())
      else:
          if do_fill_outline:
              p.drawPath(self._getFillPath())
          else:
              p.drawPath(self.getPath())
      profiler("drawPath")
  
imports: from ..Qt import QtCore, QtGui, QtWidgets
  import math
  import sys
  import warnings
  import numpy
  from ..None import Qt, debug
  from ..None import functions
  from ..None import getConfigOption
  from .GraphicsObject import GraphicsObject
label_desc: Use image node_id 29 for calling the PlotCurveItem obj's underlying member method code with example usage: obj.paint(p, opt, widget) without return types