Hardware Upgrade Forum

Hardware Upgrade Forum (https://www.hwupgrade.it/forum/index.php)
-   Programmazione (https://www.hwupgrade.it/forum/forumdisplay.php?f=38)
-   -   [PyQt] Formattare i dati prima di mostrarli in una QTableView... delegate? (https://www.hwupgrade.it/forum/showthread.php?t=2955136)


Alhazred 16-01-2022 19:55

[PyQt] Formattare i dati prima di mostrarli in una QTableView... delegate?
 
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?

pabloski 19-01-2022 10:22

Nel tuo caso è meglio subclassare QSqlRelationTableModel e reimplementare il metodo data, in modo da restituire la data nel formato corretto.

Alla fin fine tu non vuoi modificare il modo in cui viene renderizzata la cella, ma il contenuto che le viene passato.


Tutti gli orari sono GMT +1. Ora sono le: 04:46.

Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Hardware Upgrade S.r.l.