import operator import sys from PyQt4 import QtCore, QtGui def main(): app = QtGui.QApplication(sys.argv) w = MyWindow() w.show() sys.exit(app.exec_()) class MyWindow(QtGui.QWidget): tabledata = [[1,102,3],[24,15,-6],[7,8,9]] tableheader = ['a','b','c'] def __init__(self, *args): QtGui.QWidget.__init__(self, *args) # create table table = self.createTable() # layout layout = QtGui.QVBoxLayout() layout.addWidget(table) self.setLayout(layout) def createTable(self): # create the view tv = QtGui.QTableView() # set the table model tv.setModel(MyTableModel(self.tabledata, self.tableheader, self)) # set the minimum size tv.setMinimumSize(400, 300) # hide vertical header tv.verticalHeader().setVisible(False) # enable sorting tv.setSortingEnabled(True) return tv class MyTableModel(QtCore.QAbstractTableModel): def __init__(self, data, header, parent=None, *args): QtCore.QAbstractTableModel.__init__(self, parent, *args) self.arraydata = data self.headerdata = header def rowCount(self, parent): return len(self.arraydata) def columnCount(self, parent): return len(self.arraydata[0]) def data(self, index, role): if not index.isValid(): return QtCore.Qt.QVariant() elif role == QtCore.Qt.DisplayRole: return QtCore.QVariant(self.arraydata[index.row()][index.column()]) else: return QtCore.QVariant() def headerData(self, col, orientation, role): if orientation == QtCore.Qt.Horizontal and role == QtCore.Qt.DisplayRole: return QtCore.QVariant(self.headerdata[col]) return QtCore.QVariant() def sort(self, Ncol, order): self.layoutAboutToBeChanged.emit() self.arraydata = sorted(self.arraydata, key=operator.itemgetter(Ncol)) if order == QtCore.Qt.DescendingOrder: self.arraydata.reverse() self.layoutChanged.emit() if __name__ == "__main__": main()