2010-01-06 6 views
6

Ich habe eine QTableView mit einem QSqlTableModel verbunden.
In der ersten Spalte gibt es nur Termine in diesem Format: 2010-01-02
Ich mag diese Spalte das Datum in diesem Format zeigen (aber ohne die eigentlichen Daten zu ändern): 02.01.2010
Ich weiß, dass ich eine QItemDelegate zu schaffen habe für diese Spalte, aber ich weiß nicht, wie ich die vorhandenen Daten lesen und mit etwas anderem überschreiben kann. Sie haben eine Idee, wie Sie das schaffen?Zeige andere Daten in QTableView mit QItemDelegate

Antwort

4

Ein Element Delegat ändert nicht unbedingt die Daten, es rendert nur die Daten. Wenn Sie Qt 4.4 oder neuer verwenden, schauen Sie sich stattdessen QStyledItemDelegate an - es ist themenbewusst und sieht besser aus.

Es gibt ein Beispiel für Elementdelegaten in this article (das scheint ein Spiegel der offiziellen Dokumentation zu sein, die jetzt nicht mehr existiert).

Da Sie wirklich nur den Text anpassen möchten, haben Sie in Erwägung gezogen, stattdessen ein Proxy-Modell zu verwenden und nur Ihren benutzerdefinierten QString für die DisplayRole der Datumsspalte zurückzugeben?

+0

Entweder der Delegierte oder der Proxy-Modell in dieser Situation ziemlich gut funktionieren würde. Der Delegierte ist jedoch wahrscheinlich näher an dem, was beabsichtigt ist. –

+0

mein Problem ist, dass ich nicht bekomme, wie man es mit einem QItemDelegate macht. die paint() - Methode funktioniert bei mir nicht – Berschi

+0

Was ist das Problem mit paint()? – ChrisV

14

Die einfachste Lösung ist eine QStyledItemDelegate Unterklasse zu erstellen und displayText(...) dh

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

Dann Ihrer Ansicht reimplementieren -

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