title: PyQt - Implement a QAbstractTableModel for display in QTableView
body: <p>I would like to display a pandas data frame in a PyQt table. I have made some progress with this, but have not been able to correctly derive the Table Model class. Any help with this would be much appreciated.</p>
  
  <p>** Note full example code <a href="https://gist.github.com/MarshallChris/6019350">here</a> **</p>
  
  <p>I am struggling to generate a valid QtCore.QAbstractTableModel derived class. Following on from a previous question about QItemDelegates I am trying to generate a table model from a Pandas DataFrame to insert real data. I have working example code <a href="https://gist.github.com/MarshallChris/6019350">here</a>, but if I replace my TableModel with  TableModel2 in the Widget class (ln 152) I cannot get the table to display.</p>
  
  <pre><code>class TableModel2(QtCore.QAbstractTableModel): 
      def __init__(self, parent=None, *args): 
          super(TableModel2, self).__init__()
          #QtCore.QAbstractTableModel.__init__(self, parent, *args)
          self.datatable = None
          self.headerdata = None
          self.dataFrame = None
          self.model = QtGui.QStandardItemModel(self)
  
      def update(self, dataIn):
          print 'Updating Model'
          self.datatable = dataIn
          print 'Datatable : {0}'.format(self.datatable)
          headers = dataIn.columns.values
          header_items = [
                      str(field)
                      for field in headers
          ]
          self.headerdata = header_items
          print 'Headers'
          print self.headerdata
  
          for i in range(len(dataIn.index.values)):
              for j in range(len(dataIn.columns.values)):
                  #self.datatable.setItem(i,j,QtGui.QTableWidgetItem(str(df.iget_value(i, j))))
                  self.model.setItem(i,j,QtGui.QStandardItem(str(dataIn.iget_value(i, j))))
  
      def rowCount(self, parent=QtCore.QModelIndex()):
          return len(self.datatable.index) 
  
      def columnCount(self, parent=QtCore.QModelIndex()):
          return len(self.datatable.columns.values) 
  
      def data(self, index, role=QtCore.Qt.DisplayRole): 
          if not index.isValid(): 
              return QtCore.QVariant()
          elif role != QtCore.Qt.DisplayRole: 
              return QtCore.QVariant() 
          #return QtCore.QVariant(self.model.data(index)) 
              return QtCore.QVariant(self.model.data(index)) 
  
      def headerData(self, col, orientation, role):
          if orientation == QtCore.Qt.Horizontal and role == QtCore.Qt.DisplayRole:
              return QtCore.QVariant()
          return QtCore.QVariant(self.headerdata[col])
  
      def setData(self, index, value, role=QtCore.Qt.DisplayRole):
          print "setData", index.row(), index.column(), value
  
      def flags(self, index):
          if (index.column() == 0):
              return QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled
          else:
              return QtCore.Qt.ItemIsEnabled 
  </code></pre>
  
  <p>I am attempting to create the model and then add it to the view, like this:</p>
  
  <pre><code>class Widget(QtGui.QWidget):
      """
      A simple test widget to contain and own the model and table.
      """
      def __init__(self, parent=None):
          QtGui.QWidget.__init__(self, parent)
  
          l=QtGui.QVBoxLayout(self)
          cdf = self.get_data_frame()
          self._tm=TableModel(self)
          self._tm.update(cdf)
          self._tv=TableView(self)
          self._tv.setModel(self._tm)
          for row in range(0, self._tm.rowCount()):
              self._tv.openPersistentEditor(self._tm.index(row, 0))
          l.addWidget(self._tv)
  
      def get_data_frame(self):
          df = pd.DataFrame({'Name':['a','b','c','d'], 
          'First':[2.3,5.4,3.1,7.7], 'Last':[23.4,11.2,65.3,88.8], 'Class':[1,1,2,1], 'Valid':[True, True, True, False]})
          return df
  </code></pre>
  
  <p>Thanks for your attention!</p>
  
  <p>Note : Edit 2
  I have incorporated the QStandardItemModel into TableModel2. Also deleted the dataFrameToQtTable function after @mata's comment. This is getting a bit closer but still not working.</p>