Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import sys
- from PySide.QtGui import *
- from PySide.QtCore import *
- import operator
- class AaTableController(object):
- '''Application controller'''
- def __init__(self, *args):
- '''Set up the table data, the model for it and the view'''
- tabledata = [[True,2,3,'asdf',5],
- [False,7,8,'fdsa',10],
- [True,12,13,'qwer',15]]
- header = ['header0', 'header1', 'header2', 'header3', 'header4']
- self.model = AaTableModel(tabledata, header)
- self.view = AaTableView()
- self.view.setModel(self.model)
- def start(self):
- '''Start the application'''
- self.view.show()
- self.view.resizeColumnsToContents()
- class AaTableView(QTableView):
- '''Sortable table view'''
- def __init__(self, parent = None):
- super(AaTableView, self).__init__(parent)
- self.resize(400, 200)
- self.horizontalHeader().setStretchLastSection(True)
- self.setSortingEnabled(True)
- class AaTableModel(QAbstractTableModel):
- '''
- Implements some basic operations of QAbstractTableModel
- for a 2-dimensional list.
- '''
- def __init__(self, table = [[]], header = [], parent = None):
- '''
- Set up the data.
- @type table: 2-dimensional list [[]]
- @type parent: QObject
- '''
- super(AaTableModel, self).__init__(parent)
- self.setDataFromTable(table)
- self.header = header
- self.checkBoxColumns = [0]
- def setDataFromTable(self, table):
- '''
- Insert the data of 'table' into the model.
- @type table: 2-dimensional list [[]]
- '''
- self.table = table
- for rowIndex in xrange(self.rowCount()):
- for columnIndex in xrange(self.columnCount()):
- self.setData(self.index(rowIndex, columnIndex),
- self.table[rowIndex] [columnIndex])
- def rowCount(self, parent = QModelIndex()):
- '''
- Number of rows of self.table.
- @type parent: QModelIndex
- @rtype: int
- '''
- return len(self.table)
- def columnCount(self, parent = QModelIndex()):
- '''
- Number of columns of self.table.
- @type parent: QModelIndex
- @rtype: int
- '''
- return len(self.table[0])
- def data(self, index, role = Qt.DisplayRole):
- '''
- Get data of this role in the cell at this index.
- @type index: QModelIndex
- @type role: Qt.ItemDataRole
- '''
- data = self.table[index.row()] [index.column()]
- if index.column() in self.checkBoxColumns:
- if role == Qt.CheckStateRole:
- if data:
- return Qt.Checked
- else:
- return Qt.Unchecked
- elif role == Qt.DisplayRole:
- return 'active'
- elif index.isValid() and (role == Qt.EditRole or role == Qt.DisplayRole):
- return data
- def setData(self, index, value, role = Qt.EditRole):
- '''
- Update the value of the corresponding cell in self.table.
- @type index: QModelIndex
- @type value: all objects possible
- @type role: Qt.ItemDataRole
- @rtype: bool
- '''
- self.table[index.row()][index.column()] = value
- return True
- def headerData(self, col, orientation, role):
- '''Return data to be displayed in the horizontal header'''
- if orientation == Qt.Horizontal and role == Qt.DisplayRole:
- return self.header[col]
- def sort(self, Ncol, order):
- '''Sort table by given column number.'''
- self.layoutAboutToBeChanged.emit()
- self.table = sorted(self.table, key=operator.itemgetter(Ncol))
- if order == Qt.DescendingOrder:
- self.table.reverse()
- self.layoutChanged.emit()
- def flags(self, index):
- '''Checkbox cells are not Qt.ItemIsSelectable'''
- if index.column() in self.checkBoxColumns:
- return Qt.ItemIsEnabled | Qt.ItemIsUserCheckable
- else:
- return super(AaTableModel, self).flags(index)
- def main():
- app = QApplication(sys.argv)
- c = AaTableController()
- c.start()
- sys.exit(app.exec_())
- if __name__ == "__main__":
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement