class_docstr: Extension of QGraphicsScene that implements a complete, parallel mouse event system.
  (It would have been preferred to just alter the way QGraphicsScene creates and delivers 
  events, but this turned out to be impossible because the constructor for QGraphicsMouseEvent
  is private)
  
    *  Generates MouseClicked events in addition to the usual press/move/release events.
       (This works around a problem where it is impossible to have one item respond to a
       drag if another is watching for a click.)
    *  Adjustable radius around click that will catch objects so you don't have to click *exactly* over small/thin objects
    *  Global context menu--if an item implements a context menu, then its parent(s) may also add items to the menu.
    *  Allows items to decide _before_ a mouse click which item will be the recipient of mouse events.
       This lets us indicate unambiguously to the user which item they are about to click/drag on
    *  Eats mouseMove events that occur too soon after a mouse press.
    *  Reimplements items() and itemAt() to circumvent PyQt bug
  
  ====================== ====================================================================
  **Signals**
  sigMouseClicked(event) Emitted when the mouse is clicked over the scene. Use ev.pos() to
                         get the click position relative to the item that was clicked on,
                         or ev.scenePos() to get the click position in scene coordinates.
                         See :class:`pyqtgraph.GraphicsScene.mouseEvents.MouseClickEvent`.                        
  sigMouseMoved(pos)     Emitted when the mouse cursor moves over the scene. The position
                         is given in scene coordinates.
  sigMouseHover(items)   Emitted when the mouse is moved over the scene. Items is a list
                         of items under the cursor.
  sigItemAdded(item)     Emitted when an item is added via addItem(). The item is given.
  sigItemRemoved(item)   Emitted when an item is removed via removeItem(). The item is given.
  ====================== ====================================================================
  
  Mouse interaction is as follows:
  
  1) Every time the mouse moves, the scene delivers both the standard hoverEnter/Move/LeaveEvents 
     as well as custom HoverEvents. 
  2) Items are sent HoverEvents in Z-order and each item may optionally call event.acceptClicks(button), 
     acceptDrags(button) or both. If this method call returns True, this informs the item that _if_ 
     the user clicks/drags the specified mouse button, the item is guaranteed to be the 
     recipient of click/drag events (the item may wish to change its appearance to indicate this).
     If the call to acceptClicks/Drags returns False, then the item is guaranteed to *not* receive
     the requested event (because another item has already accepted it). 
  3) If the mouse is clicked, a mousePressEvent is generated as usual. If any items accept this press event, then
     No click/drag events will be generated and mouse interaction proceeds as defined by Qt. This allows
     items to function properly if they are expecting the usual press/move/release sequence of events.
     (It is recommended that items do NOT accept press events, and instead use click/drag events)
     Note: The default implementation of QGraphicsItem.mousePressEvent will *accept* the event if the 
     item is has its Selectable or Movable flags enabled. You may need to override this behavior.
  4) If no item accepts the mousePressEvent, then the scene will begin delivering mouseDrag and/or mouseClick events.
     If the mouse is moved a sufficient distance (or moved slowly enough) before the button is released, 
     then a mouseDragEvent is generated.
     If no drag events are generated before the button is released, then a mouseClickEvent is generated. 
  5) Click/drag events are delivered to the item that called acceptClicks/acceptDrags on the HoverEvent
     in step 1. If no such items exist, then the scene attempts to deliver the events to items near the event. 
     ClickEvents may be delivered in this way even if no
     item originally claimed it could accept the click. DragEvents may only be delivered this way if it is the initial
     move in a drag.
code: def mousePressEvent(self, ev):
      super().mousePressEvent(ev)
      if (
          self.mouseGrabberItem() is None
      ):  ## nobody claimed press; we are free to generate drag/click events
          if self.lastHoverEvent is not None:
              # If the mouse has moved since the last hover event, send a new one.
              # This can happen if a context menu is open while the mouse is moving.
              if ev.scenePos() != self.lastHoverEvent.scenePos():
                  self.sendHoverEvents(ev)
  
          self.clickEvents.append(MouseClickEvent(ev))
  
          ## set focus on the topmost focusable item under this click
          items = self.items(ev.scenePos())
          for i in items:
              if (
                  i.isEnabled()
                  and i.isVisible()
                  and (i.flags() & i.GraphicsItemFlag.ItemIsFocusable)
              ):
                  i.setFocus(QtCore.Qt.FocusReason.MouseFocusReason)
                  break
  
imports: import warnings
  import weakref
  from time import perf_counter, perf_counter_ns
  from ..None import debug
  from ..None import getConfigOption
  from ..Point import Point
  from ..Qt import QtCore, QtGui, QtWidgets, isQObjectAlive
  from .mouseEvents import HoverEvent, MouseClickEvent, MouseDragEvent
label_desc: Use image node_id 6 for calling the GraphicsScene obj's underlying member method code with example usage: obj.mousePressEvent(ev) without return types