2010-01-06 32 views
6

J'ai un QTableView connecté à un QSqlTableModel.
Dans la première colonne, il y a des dates que dans ce format: 2010-01-02
Je veux cette colonne pour afficher la date à ce format (mais sans changer les données réelles): 02.01.2010
Je sais que je dois créer un QItemDelegate pour cette colonne, mais je ne sais pas comment je peux lire les données existantes et écraser avec quelque chose de différent. Vous avez une idée de comment gérer cela?Afficher d'autres données dans QTableView avec QItemDelegate

Répondre

4

Un délégué d'article ne change pas nécessairement les données, il rend simplement les données. En outre, si vous utilisez Qt 4.4 ou plus récent, regardez QStyledItemDelegate à la place - il est conscient du thème et aura l'air plus agréable.

Il y a un exemple de délégués d'article dans this article (qui semble être un miroir de la documentation officielle qui est maintenant en panne ou disparue).

Depuis tout ce que vous voulez vraiment faire est de personnaliser le texte, avez-vous envisagé d'utiliser un modèle de procuration à la place et juste retourner votre QString personnalisé pour DisplayRole de la colonne de date?

+0

Soit le délégué ou le modèle proxy fonctionnerait assez bien dans cette situation. Le délégué est probablement plus proche de ce que l'intention, cependant. –

+0

mon problème est, que je ne comprends pas comment le faire avec un QItemDelegate. the paint() - méthode ne fonctionnera pas pour moi – Berschi

+0

Quel est, précisément, le problème avec paint()? – ChrisV

14

La solution la plus simple est de créer une sous-classe QStyledItemDelegate et réimplémenter displayText(...)-à-dire

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; 
}; 

Alors à votre avis -

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