2010-01-06 10 views
6

Ho un QTableView connesso con un QSqlTableModel.
Nella prima colonna, ci sono solo le date in questo formato: 2010-01-02
Voglio questa colonna per visualizzare la data in questo formato (ma senza modificare i dati reali): 02.01.2010
So che devo creare un QItemDelegate per questa colonna, ma non so come posso leggere i dati esistenti e sovrascriverli con qualcosa di diverso. Hai idea di come gestirlo?Mostra altri dati in QTableView con QItemDelegate

risposta

4

Un elemento delegato non modifica necessariamente i dati, ma esegue solo il rendering dei dati. Inoltre, se stai usando Qt 4.4 o più recente, guarda invece QStyledItemDelegate: è a conoscenza del tema e apparirà più gradevole.

C'è un esempio di delegati oggetto in this article (che sembra essere un mirror della documentazione ufficiale che ora è inattivo o mancante).

Dal momento che tutto ciò che si vuole veramente fare è personalizzare il testo, hai invece considerato l'utilizzo di un modello proxy e hai appena restituito il tuo QString personalizzato per la colonna DisplayRole della data?

+0

Sia il delegato o il modello di delega avrebbe funzionato abbastanza bene in questa situazione. Il delegato è probabilmente più vicino a ciò che intendeva, comunque. –

+0

il mio problema è che non capisco come farlo con un QItemDelegate. il metodo paint() - non funzionerà per me – Berschi

+0

Cosa, in particolare, è il problema con paint()? – ChrisV

14

La soluzione più semplice è quello di creare una sottoclasse QStyledItemDelegate e reimplementare displayText(...) cioè

class DateFormatDelegate : public QStyledItemDelegate 
{ 
public: 
DateFormatDelegate (QString dateFormat, QObject *parent = 0) : 
    QStyledItemDelegate(parent), 
    m_dateFormat(dateFormat) 
{ 
} 

virtual QString displayText(const QVariant & value, const QLocale & locale) const 
{ 
    Q_UNUSED(locale); 
    return value.toDate().toString(m_dateFormat); 
} 

private: 
QString m_dateFormat; 
}; 

Quindi secondo lei -

setItemDelegateForColumn(/*date column*/, new DateFormatDelegate("MM.dd.yyyy", this)); 
Problemi correlati