I have a QTableView connected with an QSqlTableModel.
In the first column, there are only dates at this format: 2010-01-02
I want this column to show the date at this format (but without changing the real data): 02.01.2010
I know that I have to create an QItemDelegate for this column, but I don't know how I can read the existing data and overwrite it with something different. You have any idea how to manage that?
views:
819answers:
2
+2
A:
An item delegate doesn't necessarily change the data, it just renders the data. Also, if you're using Qt 4.4 or newer, look at QStyledItemDelegate instead--it's theme-aware and will look nicer.
There's an example of item delegates in the documentation here: Star Delegate
Since all you really want to do is customize the text, have you considered using a proxy model instead and just returning your custom QString for the date column's DisplayRole?
ChrisV
2010-01-06 13:30:29
Either the delegate or the proxy model would work pretty well in this situation. The delegate is probably closer to what what intended, however.
Caleb Huitt - cjhuitt
2010-01-06 17:26:50
my problem is, that i don't get how to make it with an QItemDelegate. the paint()-method will not work for me
Berschi
2010-01-07 02:31:54
What, specifically, is the problem with paint()?
ChrisV
2010-01-07 02:43:17
i know how to get the data ( qVariantValue<QString>(index.data()) ), but i don't know how to overwrite it with "foo" for example
Berschi
2010-01-07 14:34:12
This is where using a proxy model will come in handy, as it's easier to support row/column/type-specific hacks there, but since you apparently really want a delegate...Create a QStyledItemDelegate subclass which reimplements paint() and sizeHint(). These implementations should actually check whether index.data() returns a QDate in the variant; if not, they should just call the base class's implementation. If so, do your own string conversion and either measure it (for sizeHint()) or draw it (for paint()).
ChrisV
2010-01-07 19:39:48
+1
A:
The simplest solution is to create a QStyledItemDelegate
subclass and reimplement 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;
};
Then in your view -
setItemDelegateForColumn(/*date column*/, new DateFormatDelegate("MM.dd.yyyy", this));
Noah
2010-02-16 22:26:39