Advertisement
AlexVhr

PySide QDataWidgetMapper multiple delegates

Apr 28th, 2012
1,109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.73 KB | None | 0 0
  1. #!/usr/bin/env python2
  2. # -*- coding: utf-8 -*-
  3. import sys
  4. from datetime import date
  5.  
  6. from PySide import QtGui, QtCore
  7. from PySide.QtCore import Qt
  8.  
  9. def setup_model():
  10.  
  11.     class TestModel(QtCore.QAbstractTableModel):
  12.  
  13.         def __init__(self, columns, rows):
  14.             QtCore.QAbstractTableModel.__init__(self)
  15.             self.rows = rows
  16.             self.columns = columns
  17.  
  18.         def columnCount(self, index):
  19.             return len(self.columns)
  20.  
  21.         def rowCount(self, index):
  22.             return len(self.rows)
  23.  
  24.         def data(self, index, role):
  25.             if index.isValid():
  26.                 field_id = self.columns[index.column()]
  27.                 value = getattr(self.rows[index.row()],field_id)
  28.                 if (role == Qt.EditRole) or (role == Qt.DisplayRole) or (role == Qt.ToolTipRole):
  29.                     return value
  30.  
  31.         def setData(self, index, value, role=Qt.EditRole):
  32.             if index.isValid() and role == Qt.EditRole:
  33.                 field_id = self.columns[index.column()]
  34.                 setattr(self.rows[index.row()], field_id, value)
  35.                 return True
  36.  
  37.  
  38.     class Person(object):
  39.         def __init__(self, name, birthday):
  40.             self.name = name
  41.             self.birthday = birthday
  42.  
  43.     fields = ['name', 'birthday']
  44.     rows = [
  45.         Person(u'Peter Ivanov', date(1976, 12, 1)),
  46.         Person(u'Masha Poryvayeva', date(1982, 03, 14)),
  47.         Person(u'Helge Seppälla', date(1979, 8, 15))
  48.     ]
  49.  
  50.     return TestModel(fields, rows)
  51.  
  52. class DateDelegate(QtGui.QStyledItemDelegate):
  53.  
  54.     def __init__(self, parent = None):
  55.         QtGui.QStyledItemDelegate.__init__(self, parent)
  56.  
  57.     def createEditor(self, parent, option, index):
  58.         pass
  59.  
  60.     def setEditorData(self, dateEdit, index):
  61.         value = index.model().data(index, QtCore.Qt.EditRole)
  62.         if value:
  63.             dateEdit.setDate(QtCore.QDate(value.year, value.month, value.day))
  64.  
  65.     def setModelData(self, dateEdit, model, index):
  66.         value = dateEdit.date()
  67.         model.setData(index, value.toPython())
  68.  
  69.  
  70. class LineDelegate(QtGui.QStyledItemDelegate):
  71.  
  72.     def __init__(self, parent = None):
  73.         QtGui.QStyledItemDelegate.__init__(self, parent)
  74.  
  75.     def createEditor(self, parent, option, index):
  76.         pass
  77.  
  78.     def setEditorData(self, editor, index):
  79.         editor.setText(index.model().data(index, QtCore.Qt.EditRole))
  80.  
  81.     def setModelData(self, editor, model, index):
  82.         model.setData(index, editor.text(), QtCore.Qt.EditRole)
  83.  
  84.  
  85. class DelegateProxy(QtGui.QStyledItemDelegate):
  86.  
  87.     #that's the delegate proxy, forwarding data to real delegates that will handle it properly
  88.     def __init__(self, delegates, parent=None):
  89.         QtGui.QStyledItemDelegate.__init__(self, parent)
  90.         self.delegates = delegates
  91.  
  92.     def setEditorData(self, editor, index):
  93.     #that is kinda naive and depends on column order in the model.
  94.     #you should implement your own, more reliable way to link item index
  95.     #and a delegate, responsible for handling the item
  96.         delegate = self.delegates[index.column()]
  97.         delegate.setEditorData(editor, index)
  98.  
  99.     def setModelData(self, editor, model, index):
  100.         delegate = self.delegates[index.column()]
  101.         delegate.setModelData(editor, model, index)
  102.  
  103. class MyEditWindow(QtGui.QWidget):
  104.  
  105.     def __init__(self):
  106.         QtGui.QWidget.__init__(self)
  107.         self.setLayout(QtGui.QFormLayout(self))
  108.         self.model = setup_model()
  109.         self.data_mapper = QtGui.QDataWidgetMapper(self)
  110.         self.data_mapper.setModel(self.model)
  111.         #creating widgets
  112.         self.name = QtGui.QLineEdit(self)
  113.         self.layout().addRow('Name:', self.name)
  114.  
  115.         self.birthday = QtGui.QDateEdit(self)
  116.         self.layout().addRow('Birthday:', self.birthday)
  117.  
  118.         #and mapping them
  119.         self.data_mapper.addMapping(self.name, 0)
  120.         self.data_mapper.addMapping(self.birthday, 1)
  121.         #setting up multiple delegates
  122.         delegates = [LineDelegate(self), DateDelegate(self)]
  123.         self.data_mapper.setItemDelegate(DelegateProxy(delegates, self))
  124.         self.data_mapper.toFirst()
  125.         #additional stuff
  126.         self.btn_prev = QtGui.QPushButton('Prev.', self)
  127.         self.btn_prev.clicked.connect(self.data_mapper.toPrevious)
  128.         self.btn_next = QtGui.QPushButton('Next', self)
  129.         self.btn_next.clicked.connect(self.data_mapper.toNext)
  130.  
  131.         self.buttons_layout = QtGui.QHBoxLayout()
  132.         self.layout().addRow(self.buttons_layout)
  133.         self.buttons_layout.addWidget(self.btn_prev)
  134.         self.buttons_layout.addWidget(self.btn_next)
  135.  
  136. if __name__ == '__main__':
  137.     app = QtGui.QApplication(sys.argv)
  138.     window = MyEditWindow()
  139.     window.show()
  140.     app.exec_()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement