docs: def setData(self, column, role, value):
          """
          if value is valid sets the data to value
          Args:
              column: column of item
              role: role of item (see Qt doc)
              value: value to be set
          """
          assert isinstance(column, int)
          assert isinstance(role, int)
  
          # make sure that the right row is selected, this is not always the case for checkboxes and
          # combo boxes because they are items on top of the tree structure
          if isinstance(value, (QtWidgets.QComboBox, QtWidgets.QCheckBox)):
              self.treeWidget().setCurrentItem(self)
  
          # if row 2 (editrole, value has been entered)
          if role == 2 and column == 1:
  
              if isinstance(value, str):
                  value = self.cast_type(value) # cast into same type as valid values
  
              if isinstance(value, QtCore.QVariant):
                  value = self.cast_type(value.toString())  # cast into same type as valid values
  
              if isinstance(value, QtWidgets.QComboBox):
                  value = self.cast_type(value.currentText())
  
              if isinstance(value, QtWidgets.QCheckBox):
                  value = bool(int(value.checkState()))  # checkState() gives 2 (True) and 0 (False)
  
              # save value in internal variable
              self.value = value
  
          elif column == 0:
              # labels should not be changed so we set it back
              value = self.name
  
          if value is None:
              value = self.value
  
          # 180327(asafira) --- why do we need to do the following lines? Why not just always call super or always
          # emitDataChanged()?
          if not isinstance(value, bool):
              super(B26QTreeItem, self).setData(column, role, value)
  
          else:
              self.emitDataChanged()