class QDataFrameTableView(QTableView):

    def __init__(self, model, parent=None, **kwds):
        super(QDataFrameTableView, self).__init__(parent=parent, **kwds)
        self.model = model
        self.setModel(model)
        self._setup_scrolling()
        self._setup_headers()

    def _setup_scrolling(self):
        self.setVerticalScrollMode(QAbstractItemView.ScrollPerItem)
        self.setHorizontalScrollMode(QAbstractItemView.ScrollPerItem)

    def _setup_headers(self):
        self.vheader = QHeaderView(Qt.Vertical)
        self.setVerticalHeader(self.vheader)
        self.vheader.setResizeMode(QHeaderView.Fixed)
        self.vheader.setDefaultSectionSize(20)
        self.hheader = self.horizontalHeader()
        self.hheader.setMovable(True)

    def save_state(self):
        return self.hheader.saveState()

    def set_state(self, state):
        self.hheader.restoreState(state)