Visualizzazione dei risultati da 1 a 2 su 2

Visualizzazione discussione

  1. #1
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,505

    [PYTHON] PyQt: formattare i dati prima di mostrarli in una QTableView

    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?
    Ultima modifica di Alhazred; 16-01-2022 a 21:56

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.