class_docstr: State manager for groups of widgets.
  
  WidgetGroup handles common problems that arise when dealing with groups of widgets like a control
  panel:
  - Provide a single place for saving / restoring the state of all widgets in the group
  - Provide a single signal for detecting when any of the widgets have changed
docstr: Initialize WidgetGroup, adding specified widgets into this group.
  widgetList can be: 
   - a list of widget specifications (widget, [name], [scale])
   - a dict of name: widget pairs
   - any QObject, and all compatible child widgets will be added recursively.
  
  The 'scale' parameter for each widget allows QSpinBox to display a different value than the value recorded
  in the group state (for example, the program may set a spin box value to 100e-6 and have it displayed as 100 to the user)
docstr_tok: ["Initialize","WidgetGroup",",","adding","specified","widgets","into","this","group",".","widgetList","can","be",":","-","a","list","of","widget","specifications","(","widget",",","[","name","]",",","[","scale","]",")","-","a","dict","of","name",":","widget","pairs","-","any","QObject",",","and","all","compatible","child","widgets","will","be","added","recursively",".","The","'scale","'","parameter","for","each","widget","allows","QSpinBox","to","display","a","different","value","than","the","value","recorded","in","the","group","state","(","for","example",",","the","program","may","set","a","spin","box","value","to","100e-6","and","have","it","displayed","as","100","to","the","user",")"]
code: def __init__(self, widgetList=None):
      """Initialize WidgetGroup, adding specified widgets into this group.
      widgetList can be:
       - a list of widget specifications (widget, [name], [scale])
       - a dict of name: widget pairs
       - any QObject, and all compatible child widgets will be added recursively.
  
      The 'scale' parameter for each widget allows QSpinBox to display a different value than the value recorded
      in the group state (for example, the program may set a spin box value to 100e-6 and have it displayed as 100 to the user)
      """
      QtCore.QObject.__init__(self)
      self.widgetList = (
          weakref.WeakKeyDictionary()
      )  # Make sure widgets don't stick around just because they are listed here
      self.scales = weakref.WeakKeyDictionary()
      self.cache = {}  # name:value pairs
      self.uncachedWidgets = weakref.WeakKeyDictionary()
      if isinstance(widgetList, QtCore.QObject):
          self.autoAdd(widgetList)
      elif isinstance(widgetList, list):
          for w in widgetList:
              self.addWidget(*w)
      elif isinstance(widgetList, dict):
          for name, w in widgetList.items():
              self.addWidget(w, name)
      elif widgetList is None:
          return
      else:
          raise Exception("Wrong argument type %s" % type(widgetList))
  
imports: import inspect
  import weakref
  from .Qt import QtCore, QtWidgets
label_desc: Use image node_id 1 to create a new WidgetGroup object from inherited base classes: QtCore with example: obj = WidgetGroup(widgetList)