Mostrar outros dados em QTableView com QItemDelegate
-
19-09-2019 - |
Pergunta
Eu tenho um QTableView conectado com um QSqlTableModel.
Na primeira coluna, existem apenas datas neste formato: 2010-01-02
Eu quero esta coluna para mostrar a data neste formato (mas sem alterar os dados reais): 02.01.2010
Eu sei que eu tenho que criar uma QItemDelegate para esta coluna, mas eu não sei como eu posso ler os dados existentes e substituí-lo com algo diferente. Você tem alguma idéia de como gerenciar isso?
Solução
Um delegado do item não necessariamente alterar os dados, ele só processa os dados. Além disso, se você estiver usando o Qt 4.4 ou mais recente, olhada QStyledItemDelegate vez. - É tema-aware e vai olhar mais agradável
Há um exemplo de delegados de itens em este artigo (o que parece para ser um espelho da documentação oficial que agora está para baixo ou se foi).
Uma vez que tudo o que você realmente quer fazer é personalizar o texto, você já pensou em usar um modelo de proxy em vez e apenas devolver o QString personalizado para DisplayRole da coluna de data?
Outras dicas
A solução mais simples é criar um QStyledItemDelegate
subclasse e Reimplementar displayText(...)
ie
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;
};
Então, na sua opinião -
setItemDelegateForColumn(/*date column*/, new DateFormatDelegate("MM.dd.yyyy", this));