2010-01-06 16 views
6

Tengo un QTableView conectado con un QSqlTableModel.
En la primera columna, sólo hay fechas en este formato: 2010-01-02
Quiero esta columna para mostrar la fecha en este formato (pero sin cambiar los datos reales): 02.01.2010
Yo sé que tengo que crear una QItemDelegate para esta columna, pero no sé cómo puedo leer los datos existentes y sobrescribirlos con algo diferente. ¿Tienes alguna idea de cómo manejar eso?Mostrar otros datos en QTableView con QItemDelegate

Respuesta

4

Un elemento delegado no cambia necesariamente los datos, simplemente procesa los datos. Además, si está utilizando Qt 4.4 o una versión más nueva, mire QStyledItemDelegate en su lugar, tiene en cuenta los temas y se verá mejor.

Hay un ejemplo de delegados de elementos en this article (que parece ser un espejo de la documentación oficial que ahora está fuera de servicio o desaparecida).

Como todo lo que desea hacer es personalizar el texto, ¿ha considerado utilizar un modelo de proxy en su lugar y simplemente devolver su QString personalizado para la columna DisplayRole de la fecha?

+0

O bien el delegado o el modelo de poder que funciona bastante bien en esta situación. Sin embargo, el delegado probablemente esté más cerca de lo que pretendía. –

+0

mi problema es que no entiendo cómo hacerlo con un QItemDelegate. el método paint() - no funcionará para mí – Berschi

+0

¿Cuál es, específicamente, el problema con la pintura()? – ChrisV

14

La solución más sencilla es crear una subclase QStyledItemDelegate y reimplementar displayText(...) es decir

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

A continuación, en su opinión -

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