title: PyQt - Column of Checkboxes in a QTableView
body: <p>I am dynamically creating a QTableView from a Pandas dataframe. I have example code <a href="https://gist.github.com/MarshallChris/6029919" rel="noreferrer">here.</a></p>
  
  <p>I can create the table, with the checkboxes but I cannot get the checkboxes to reflect the model data, or even to change at all to being unchecked.</p>
  
  <p>I am following example code from this previous <a href="https://stackoverflow.com/questions/3363190/qt-qtableview-how-to-have-a-checkbox-only-column">question</a> and taking @raorao answer as a guide. This will display the boxes in the table, but non of the functionality is working.</p>
  
  <p>Can anyone suggest any changes, or what is wrong with this code. Why is it not reflecting the model, and why can it not change?</p>
  
  <p>Do check out my full example code <a href="https://gist.github.com/MarshallChris/6029919" rel="noreferrer">here.</a></p>
  
  <p><strong>Edit one</strong> : Update after comment from Frodon : 
  corrected string cast to bool with a comparison xxx == 'True'</p>
  
  <pre><code>class CheckBoxDelegate(QtGui.QStyledItemDelegate):
      """
      A delegate that places a fully functioning QCheckBox in every
      cell of the column to which it's applied
      """
      def __init__(self, parent):
          QtGui.QItemDelegate.__init__(self, parent)
  
      def createEditor(self, parent, option, index):
          '''
          Important, otherwise an editor is created if the user clicks in this cell.
          ** Need to hook up a signal to the model
          '''
          return None
  
      def paint(self, painter, option, index):
          '''
          Paint a checkbox without the label.
          '''
          checked = index.model().data(index, QtCore.Qt.DisplayRole) == 'True'
          check_box_style_option = QtGui.QStyleOptionButton()
  
          if (index.flags() &amp; QtCore.Qt.ItemIsEditable) &gt; 0:
              check_box_style_option.state |= QtGui.QStyle.State_Enabled
          else:
              check_box_style_option.state |= QtGui.QStyle.State_ReadOnly
  
          if checked:
              check_box_style_option.state |= QtGui.QStyle.State_On
          else:
              check_box_style_option.state |= QtGui.QStyle.State_Off
  
          check_box_style_option.rect = self.getCheckBoxRect(option)
  
          # this will not run - hasFlag does not exist
          #if not index.model().hasFlag(index, QtCore.Qt.ItemIsEditable):
              #check_box_style_option.state |= QtGui.QStyle.State_ReadOnly
  
          check_box_style_option.state |= QtGui.QStyle.State_Enabled
  
          QtGui.QApplication.style().drawControl(QtGui.QStyle.CE_CheckBox, check_box_style_option, painter)
  
      def editorEvent(self, event, model, option, index):
          '''
          Change the data in the model and the state of the checkbox
          if the user presses the left mousebutton or presses
          Key_Space or Key_Select and this cell is editable. Otherwise do nothing.
          '''
          print 'Check Box editor Event detected : ' 
          if not (index.flags() &amp; QtCore.Qt.ItemIsEditable) &gt; 0:
              return False
  
          print 'Check Box edior Event detected : passed first check' 
          # Do not change the checkbox-state
          if event.type() == QtCore.QEvent.MouseButtonRelease or event.type() == QtCore.QEvent.MouseButtonDblClick:
              if event.button() != QtCore.Qt.LeftButton or not self.getCheckBoxRect(option).contains(event.pos()):
                  return False
              if event.type() == QtCore.QEvent.MouseButtonDblClick:
                  return True
          elif event.type() == QtCore.QEvent.KeyPress:
              if event.key() != QtCore.Qt.Key_Space and event.key() != QtCore.Qt.Key_Select:
                  return False
              else:
                  return False
  
          # Change the checkbox-state
          self.setModelData(None, model, index)
          return True
  </code></pre>