Advertisement
Guest User

Untitled

a guest
Feb 11th, 2016
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.77 KB | None | 0 0
  1. from functools import partial
  2. from sys import argv, exit
  3.  
  4. from PyQt5.QtCore import (Qt, QAbstractTableModel, QModelIndex, pyqtProperty,
  5. pyqtSignal, QVariant)
  6. from PyQt5.QtWidgets import (QApplication, QFrame, QStyledItemDelegate, QTableView,
  7. QFormLayout, QSlider)
  8.  
  9.  
  10. class MyAbstractItem(object):
  11.  
  12. def data(self, role):
  13. raise NotImplementedError
  14.  
  15. def setData(self, value, role):
  16. raise NotImplementedError
  17.  
  18.  
  19. class MyTextItem(MyAbstractItem):
  20.  
  21. def __init__(self, text):
  22. self._text = text
  23.  
  24. def data(self, role):
  25. if role != Qt.DisplayRole and role != Qt.EditRole:
  26. return None
  27.  
  28. return self._text
  29.  
  30. def setData(self, text, role):
  31. if role != Qt.EditRole:
  32. return False
  33.  
  34. self._text = text
  35.  
  36. return True
  37.  
  38.  
  39. class MyCoolItem(MyAbstractItem):
  40.  
  41. def __init__(self, values):
  42. self._values = values #: dict: Maps names to values
  43.  
  44. def data(self, role):
  45. if role == Qt.DisplayRole:
  46. return str(self._values) # Just as string for now.
  47. elif role == Qt.EditRole:
  48. return self._values
  49.  
  50. return None
  51.  
  52. def setData(self, values, role):
  53. if role != Qt.EditRole:
  54. return False
  55.  
  56. self._values = values
  57.  
  58. return True
  59.  
  60.  
  61. class MyCoolEditor(QFrame):
  62.  
  63. def __init__(self, parent=None):
  64. super(MyCoolEditor, self).__init__(parent)
  65. self._values = None
  66. self.setAutoFillBackground(True)
  67. self.setFrameStyle(QFrame.StyledPanel | QFrame.Raised)
  68. self.setLayout(QFormLayout())
  69.  
  70. @pyqtProperty(QVariant, user=True)
  71. def values(self):
  72. return self._values
  73.  
  74. @values.setter
  75. def values(self, values):
  76. self._values = values
  77.  
  78. while self.layout().count() > 0:
  79. self.layout().takeAt(0)
  80.  
  81. for name, value in values.items():
  82. slider = QSlider(Qt.Horizontal)
  83. slider.setMinimum(0)
  84. slider.setMaximum(100)
  85. slider.setValue(value)
  86. slider.valueChanged.connect(partial(self._setValue, name))
  87. self.layout().addRow(name + ':', slider)
  88.  
  89. def _setValue(self, name, value):
  90. self._values[name] = value
  91.  
  92.  
  93. class MyCoolDelegate(QStyledItemDelegate):
  94.  
  95. def createEditor(self, parent, option, index):
  96. values = index.data(Qt.EditRole)
  97.  
  98. if isinstance(values, dict):
  99. return MyCoolEditor(parent)
  100.  
  101. return super(MyCoolDelegate, self).createEditor(parent, option, index)
  102.  
  103. def updateEditorGeometry(self, editor, option, index):
  104. editor.setGeometry(option.rect.x(),
  105. option.rect.y() + option.rect.height(), 200, 60)
  106.  
  107.  
  108. class MyModel(QAbstractTableModel):
  109.  
  110. def __init__(self, headers, rows, parent=None):
  111. super(MyModel, self).__init__(parent)
  112.  
  113. self._headers = headers
  114. self._rows = rows
  115.  
  116. def rowCount(self, parent=QModelIndex()):
  117. if parent.isValid():
  118. return 0
  119.  
  120. return len(self._rows)
  121.  
  122. def columnCount(self, parent=QModelIndex()):
  123. return len(self._headers)
  124.  
  125. def headerData(self, section, orientation, role=Qt.DisplayRole):
  126. if orientation != Qt.Horizontal or role != Qt.DisplayRole:
  127. return None
  128.  
  129. return self._headers[section]
  130.  
  131. def data(self, index, role=Qt.DisplayRole):
  132. if not index.isValid():
  133. return None
  134.  
  135. # Delegate to the item at the given index.
  136. return self._rows[index.row()][index.column()].data(role)
  137.  
  138. def setData(self, index, value, role=Qt.EditRole):
  139. if not index.isValid():
  140. return False
  141.  
  142. # Delegate to the item at the given index.
  143. if self._rows[index.row()][index.column()].setData(value, role):
  144. self.dataChanged.emit(index, index)
  145. return True
  146.  
  147. return False
  148.  
  149. def flags(self, index):
  150. if not index.isValid():
  151. return Qt.NoItemFlags
  152.  
  153. return Qt.ItemIsEditable | Qt.ItemIsEnabled | Qt.ItemIsSelectable
  154.  
  155.  
  156. app = None
  157.  
  158.  
  159. def main():
  160. global app
  161.  
  162. app = QApplication(argv)
  163.  
  164. model = MyModel(
  165. headers=['Cool Column', 'Text Column', 'Text Column'],
  166. rows=[
  167. [MyCoolItem({'a': 10, 'b': 20}), MyTextItem('c'), MyTextItem('c')],
  168. [MyCoolItem({'d': 30, 'e': 50}), MyTextItem('f'), MyTextItem('c')],
  169. [MyCoolItem({'d': 30, 'e': 50}), MyTextItem('f'), MyTextItem('c')],
  170. [MyCoolItem({'d': 30, 'e': 50}), MyTextItem('f'), MyTextItem('c')],
  171. [MyCoolItem({'d': 30, 'e': 50}), MyTextItem('f'), MyTextItem('c')]
  172. ],
  173. parent=app
  174. )
  175.  
  176. delegate = MyCoolDelegate(model)
  177.  
  178. view = QTableView()
  179. view.setItemDelegateForColumn(0, delegate)
  180. view.setModel(model)
  181. view.show()
  182.  
  183. exit(app.exec_())
  184.  
  185.  
  186. if __name__ == '__main__':
  187. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement