docs: def _qt_set_leaf_data(self, qvar):
      """ Sets backend data using QVariants """
      if VERBOSE_PREF:
          print('')
          print('+--- [pref.qt_set_leaf_data]')
          print('[pref.qt_set_leaf_data] qvar = %r' % qvar)
          print('[pref.qt_set_leaf_data] _intern.name=%r' % self._intern.name)
          print('[pref.qt_set_leaf_data] _intern.type_=%r' % self._intern.get_type())
          print('[pref.qt_set_leaf_data] type(_intern.value)=%r' % type(self._intern.value))
          print('[pref.qt_set_leaf_data] _intern.value=%r' % self._intern.value)
          #print('[pref.qt_set_leaf_data] qvar.toString()=%s' % six.text_type(qvar.toString()))
      if self._tree.parent is None:
          raise Exception('[Pref.qtleaf] Cannot set root preference')
      if self.qt_is_editable():
          new_val = '[Pref.qtleaf] BadThingsHappenedInPref'
          if self._intern.value == PrefNode:
              raise Exception('[Pref.qtleaf] Qt can only change leafs')
          elif self._intern.value is None:
              # None could be a number of types
              def cast_order(var, order=[bool, int, float, six.text_type]):
                  for type_ in order:
                      try:
                          ret = type_(var)
                          return ret
                      except Exception:
                          continue
              new_val = cast_order(six.text_type(qvar))
          self._intern.get_type()
          if isinstance(self._intern.value, bool):
              #new_val = bool(qvar.toBool())
              print('qvar = %r' % (qvar,))
              new_val = util_type.smart_cast(qvar, bool)
              #new_val = bool(eval(qvar, {}, {}))
              print('new_val = %r' % (new_val,))
          elif isinstance(self._intern.value, int):
              #new_val = int(qvar.toInt()[0])
              new_val = int(qvar)
          # elif isinstance(self._intern.value, float):
          elif self._intern.get_type() in util_type.VALID_FLOAT_TYPES:
              #new_val = float(qvar.toDouble()[0])
              new_val = float(qvar)
          elif isinstance(self._intern.value, six.string_types):
              #new_val = six.text_type(qvar.toString())
              new_val = six.text_type(qvar)
          elif isinstance(self._intern.value, PrefChoice):
              #new_val = qvar.toString()
              new_val = six.text_type(qvar)
              if new_val.upper() == 'NONE':
                  new_val = None
          else:
              try:
                  #new_val = six.text_type(qvar.toString())
                  type_ = self._intern.get_type()
                  if type_ is not None:
                      new_val = type_(six.text_type(qvar))
                  else:
                      new_val = six.text_type(qvar)
              except Exception:
                  raise NotImplementedError(
                      ('[Pref.qtleaf] Unknown internal type. '
                       'type(_intern.value) = %r, '
                       '_intern.get_type() = %r, ')
                      % type(self._intern.value), self._intern.get_type())
          # Check for a set of None
          if isinstance(new_val, six.string_types):
              if new_val.lower() == 'none':
                  new_val = None
              elif new_val.lower() == 'true':
                  new_val = True
              elif new_val.lower() == 'false':
                  new_val = False
          # save to disk after modifying data
          if VERBOSE_PREF:
              print('---')
              print('[pref.qt_set_leaf_data] new_val=%r' % new_val)
              print('[pref.qt_set_leaf_data] type(new_val)=%r' % type(new_val))
              print('L____ [pref.qt_set_leaf_data]')
          # TODO Add ability to set a callback function when certain
          # preferences are changed.
          return self._tree.parent.pref_update(self._intern.name, new_val)
      return 'PrefNotEditable'