Advertisement
Guest User

PySide MVC Table

a guest
Apr 10th, 2012
344
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.50 KB | None | 0 0
  1. import sys
  2. from PySide.QtGui import *
  3. from PySide.QtCore import *
  4. import operator
  5.  
  6. class AaTableController(object):
  7.     '''Application controller'''
  8.    
  9.     def __init__(self, *args):
  10.         '''Set up the table data, the model for it and the view'''
  11.        
  12.         tabledata = [[True,2,3,'asdf',5],
  13.                      [False,7,8,'fdsa',10],
  14.                      [True,12,13,'qwer',15]]
  15.         header = ['header0', 'header1', 'header2', 'header3', 'header4']
  16.         self.model = AaTableModel(tabledata, header)
  17.        
  18.         self.view = AaTableView()
  19.         self.view.setModel(self.model)
  20.        
  21.     def start(self):
  22.         '''Start the application'''
  23.        
  24.         self.view.show()
  25.         self.view.resizeColumnsToContents()
  26.        
  27.        
  28.    
  29. class AaTableView(QTableView):
  30.     '''Sortable table view'''
  31.    
  32.     def __init__(self, parent = None):
  33.         super(AaTableView, self).__init__(parent)
  34.         self.resize(400, 200)
  35.         self.horizontalHeader().setStretchLastSection(True)
  36.         self.setSortingEnabled(True)
  37.        
  38.    
  39. class AaTableModel(QAbstractTableModel):
  40.     '''
  41.    Implements some basic operations of QAbstractTableModel
  42.    for a 2-dimensional list.
  43.    '''
  44.    
  45.     def __init__(self, table = [[]], header = [], parent = None):
  46.         '''
  47.        Set up the data.
  48.        @type table: 2-dimensional list [[]]
  49.        @type parent: QObject
  50.        '''
  51.         super(AaTableModel, self).__init__(parent)
  52.         self.setDataFromTable(table)
  53.         self.header = header
  54.         self.checkBoxColumns = [0]
  55.        
  56.     def setDataFromTable(self, table):
  57.         '''
  58.        Insert the data of 'table' into the model.
  59.        @type table: 2-dimensional list [[]]
  60.        '''
  61.         self.table = table
  62.         for rowIndex in xrange(self.rowCount()):
  63.             for columnIndex in xrange(self.columnCount()):
  64.                 self.setData(self.index(rowIndex, columnIndex),
  65.                              self.table[rowIndex] [columnIndex])
  66.    
  67.     def rowCount(self, parent = QModelIndex()):
  68.         '''
  69.        Number of rows of self.table.
  70.        @type parent: QModelIndex
  71.        @rtype: int
  72.        '''
  73.         return len(self.table)
  74.    
  75.     def columnCount(self, parent = QModelIndex()):
  76.         '''
  77.        Number of columns of self.table.
  78.        @type parent: QModelIndex
  79.        @rtype: int
  80.        '''
  81.         return len(self.table[0])
  82.    
  83.     def data(self, index, role = Qt.DisplayRole):
  84.         '''
  85.        Get data of this role in the cell at this index.
  86.        @type index: QModelIndex
  87.        @type role: Qt.ItemDataRole
  88.        '''
  89.         data = self.table[index.row()] [index.column()]
  90.         if index.column() in self.checkBoxColumns:
  91.             if role == Qt.CheckStateRole:
  92.                 if data:
  93.                     return Qt.Checked
  94.                 else:
  95.                     return Qt.Unchecked
  96.             elif role == Qt.DisplayRole:
  97.                 return 'active'
  98.         elif index.isValid() and (role == Qt.EditRole or role == Qt.DisplayRole):
  99.             return data
  100.        
  101.     def setData(self, index, value, role = Qt.EditRole):
  102.         '''
  103.        Update the value of the corresponding cell in self.table.
  104.        @type index: QModelIndex
  105.        @type value: all objects possible
  106.        @type role: Qt.ItemDataRole
  107.        @rtype: bool
  108.        '''
  109.         self.table[index.row()][index.column()] = value
  110.         return True
  111.    
  112.    
  113.     def headerData(self, col, orientation, role):
  114.         '''Return data to be displayed in the horizontal header'''
  115.        
  116.         if orientation == Qt.Horizontal and role == Qt.DisplayRole:
  117.             return self.header[col]
  118.  
  119.     def sort(self, Ncol, order):
  120.         '''Sort table by given column number.'''
  121.        
  122.         self.layoutAboutToBeChanged.emit()
  123.         self.table = sorted(self.table, key=operator.itemgetter(Ncol))        
  124.         if order == Qt.DescendingOrder:
  125.             self.table.reverse()
  126.         self.layoutChanged.emit()
  127.  
  128.        
  129.     def flags(self, index):
  130.         '''Checkbox cells are not Qt.ItemIsSelectable'''
  131.        
  132.         if index.column() in self.checkBoxColumns:
  133.             return Qt.ItemIsEnabled | Qt.ItemIsUserCheckable
  134.         else:
  135.             return super(AaTableModel, self).flags(index)
  136.        
  137.  
  138.  
  139.  
  140. def main():
  141.     app = QApplication(sys.argv)
  142.     c = AaTableController()
  143.     c.start()
  144.     sys.exit(app.exec_())
  145.    
  146.    
  147.  
  148. if __name__ == "__main__":
  149.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement