Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python3
- # -*- coding: utf-8 -*-
- """Trying to implement a simple custom editor for Qt's MV-framework.
- Problems:
- The editor (MyButtonEdit) does not update model data on focus out event, when placed
- on a form and mapped to QDataWidgetMapper. It works fine in QTableView though.
- """
- import sys
- from PySide import QtGui, QtCore
- from PySide.QtCore import Qt
- class EmbeddedButton(QtGui.QToolButton):
- def __init__(self, parent, text, icon=None, slot=None, shortcut=None, tooltip=None):
- super().__init__(parent)
- self.setCursor(QtCore.Qt.ArrowCursor)
- self.setFocusPolicy(Qt.NoFocus)
- self.setText(text)
- if slot:
- self.clicked.connect(slot)
- if shortcut:
- self.setShortcut(shortcut)
- if tooltip:
- self.setToolTip(tooltip)
- class ButtonEdit(QtGui.QWidget):
- def __init__(self, parent=None):
- super().__init__(parent)
- layout = QtGui.QHBoxLayout()
- layout.setContentsMargins(0, 0, 0, 0)
- layout.setSpacing(0)
- self.setLayout(layout)
- self.line_edit = QtGui.QLineEdit(self)
- self.text = self.line_edit.text
- self.setText = self.line_edit.setText
- self.layout().addWidget(self.line_edit)
- self.buttons = {}
- self.setFocusProxy(self.line_edit)
- self.line_edit.installEventFilter(self)
- def eventFilter(self, target, event):
- if target == self.line_edit:
- if event.type() == QtCore.QEvent.KeyPress:
- if event.key() == Qt.Key_Tab:
- self.keyPressEvent(event)
- return True
- elif event.type() == QtCore.QEvent.FocusOut:
- self.focusOutEvent(event)
- #can not return True - the imput cursor will duplicate.
- # And the data will not be updated anyway.
- return False
- def addButton(self, id, text, icon=None, slot=None, shortcut=None, tooltip=None):
- button = EmbeddedButton(self, text, icon, slot, shortcut, tooltip)
- self.layout().addWidget(button)
- self.buttons[id] = button
- class MyButtonEdit(ButtonEdit):
- def __init__(self, parent=None):
- super().__init__(parent)
- self.addButton('first', '1')
- self.addButton('second','2')
- self.addButton('third','3')
- class MyDelegate(QtGui.QStyledItemDelegate):
- def __init__(self, parent):
- QtGui.QStyledItemDelegate.__init__(self, parent)
- def createEditor(self, parent, option, index):
- editor = MyButtonEdit(parent)
- editor.setAutoFillBackground(True)
- editor.installEventFilter(self)
- return editor
- def updateEditorGeometry(self, editor, option, index):
- editor.setGeometry(option.rect)
- def setEditorData(self, editor, index):
- editor.line_edit.setText(index.model().data(index, Qt.EditRole))
- def setModelData(self, editor, model, index):
- model.setData(index, editor.line_edit.text())
- class MyModel(QtCore.QAbstractTableModel):
- class Person:
- def __init__(self, f_name, l_name):
- self.f_name = f_name
- self.l_name = l_name
- def __init__(self, parent):
- super().__init__(parent)
- self.rows = [MyModel.Person('Joe', 'Smith'), MyModel.Person('Mary', 'Dow')]
- self.columns = ['f_name', 'l_name']
- def columnCount(self, index):
- return len(self.columns)
- def rowCount(self, index):
- return len(self.rows)
- def flags(self, index):
- Qt = QtCore.Qt
- if index.isValid():
- return Qt.ItemIsSelectable | Qt.ItemIsEnabled | Qt.ItemIsEditable
- def data(self, index, role):
- if role == QtCore.Qt.EditRole or role == QtCore.Qt.DisplayRole:
- attr_name = self.columns[index.column()]
- person = self.rows[index.row()]
- return getattr(person, attr_name)
- def setData(self, index, value, role=Qt.EditRole):
- if index.isValid() and role == Qt.EditRole:
- field_name = self.columns[index.column()]
- row = self.rows[index.row()]
- setattr(row, field_name, value)
- self.dataChanged.emit(index, index)
- return True
- class MyWin(QtGui.QDialog):
- def __init__(self):
- super().__init__()
- model = MyModel(self)
- mapper = QtGui.QDataWidgetMapper(self)
- mapper.setSubmitPolicy(QtGui.QDataWidgetMapper.AutoSubmit)
- mapper.setModel(model)
- mapper.setItemDelegate(MyDelegate(self))
- lay = QtGui.QVBoxLayout(self)
- table_view = QtGui.QTableView(self)
- table_view.setModel(model)
- table_view.setItemDelegateForColumn(0, MyDelegate(self))
- table_view.setItemDelegateForColumn(1, MyDelegate(self))
- ed_f_name = MyButtonEdit(self)
- ed_l_name = MyButtonEdit(self)
- lay.addWidget(table_view)
- lay.addWidget(ed_f_name)
- lay.addWidget(ed_l_name)
- mapper.addMapping(ed_f_name, 0)
- mapper.addMapping(ed_l_name, 1)
- mapper.toFirst()
- if __name__ == '__main__':
- app = QtGui.QApplication(sys.argv)
- win = MyWin()
- win.show()
- sys.exit(app.exec_())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement