Devo mostrare dei dati in una tabella, ma prima di farlo ho bisogno di formattare alcuni campi, ad esempio le date che sono salvate nel DB in formato YYYY-MM-DD.
Cercando informazioni credo di aver capito che mi serve definire un delegato.
La classe che definisce il model è attualmente questa
Codice:
class JobModel():
_tab_job = 'lavori'
def __init__(self):
super(JobModel, self).__init__()
self.model = self._createModel(self._tab_job)
@staticmethod
def _createModel(table):
"""Create and set up the model."""
tableModel = QSqlRelationalTableModel()
tableModel.setTable(table)
tableModel.setEditStrategy(QSqlRelationalTableModel.OnFieldChange)
tableModel.setRelation(1, QSqlRelation('clienti', 'id', 'nome'))
tableModel.select()
headers = ("ID", "Cliente", "Numero", "Nome", "Data Provino",
"Data Conferma", "Data Incisione", "Data Consegna", "Note")
for columnIndex, header in enumerate(headers):
tableModel.setHeaderData(columnIndex, Qt.Horizontal, header)
return tableModel
Nella view mostro i dati della tabella in questo modo
Codice:
self.ui.tbl_result.setModel(self.jobModel.model)
self.ui.tbl_result.setSelectionBehavior(QAbstractItemView.SelectRows)
self.ui.tbl_result.resizeColumnsToContents()
# Il delegato per la quinta colonna (prima data) dovrebbe essere richiamato in questo modo
self.ui.tbl_result.setItemDelegateForColumn(
4, JobDateDelegate(self.ui.tbl_result))
Il mio problema è che non capisco come implementare il delegato, ho provato in questo modo
Codice:
class JobDateDelegate(QtWidgets.QStyledItemDelegate):
def __init__(self, owner):
super().__init__(owner)
def paint(self, painter, option, index):
if isinstance(self.parent(), QtWidgets.QAbstractItemView):
self.parent().openPersistentEditor(index)
super(JobDateDelegate, self).paint(painter, option, index)
def createEditor(self, parent, option, index):
# Qui non so che tipo di widget definire, nessuno sembra corrispondere alle celle della tabella
editor = QtWidgets.QTextEdit(parent)
# Qui (?) va definita la logica per formattare le date
return editor
def commit_editor(self):
editor = self.sender()
self.commitData.emit(editor)
def setEditorData(self, editor, index):
value = index.data(QtCore.Qt.DisplayRole)
editor.setText(value)
def setModelData(self, editor, model, index):
value = index.data(QtCore.Qt.DisplayRole)
model.setData(index, value, QtCore.Qt.DisplayRole)
def updateEditorGeometry(self, editor, option, index):
editor.setGeometry(option.rect)
Le date vengono formattate, ma non penso sia il modo giusto di procedere, perché intanto le celle vengono renderizzate in modo diverso rispetto a quelle non interessate dal delegato.
Qual è il modo corretto di procedere?