class_docstr: Extends QProgressDialog:
  
    * Adds context management so the dialog may be used in `with` statements
    * Allows nesting multiple progress dialogs
  
  Example::
  
      with ProgressDialog("Processing..", minVal, maxVal) as dlg:
          # do stuff
          dlg.setValue(i)   ## could also use dlg += 1
          if dlg.wasCanceled():
              raise Exception("Processing canceled by user")
code: def _extractWidgets(self):
      # return:
      #   1. a single widget containing the label and progress bar
      #   2. the cancel button
  
      if self._nestableWidgets is None:
          label = [
              ch
              for ch in self.children()
              if isinstance(ch, QtWidgets.QLabel)
          ][0]
          bar = [
              ch
              for ch in self.children()
              if isinstance(ch, QtWidgets.QProgressBar)
          ][0]
          btn = [
              ch
              for ch in self.children()
              if isinstance(ch, QtWidgets.QPushButton)
          ][0]
  
          sw = ProgressWidget(label, bar)
  
          self._nestableWidgets = (sw, btn)
  
      return self._nestableWidgets
  
imports: from time import perf_counter
  from ..Qt import QtCore, QtGui, QtWidgets
label_desc: Use image node_id 8 for calling the ProgressDialog obj's underlying member method code with example usage: obj._extractWidgets() and returns: self