Most databases store dates in the format YYYY-MM-DD. When using a QTableView to display a database table in PyQt it’s useful to be able to display this in a different format. Being from the UK I’d rather have the date displayed in the UK style – DD/MM/YYYY. This is where QStyledItemDelegate comes in.

I’d put off looking into this for a while because whenever I tried to look in to using QStyledItemDelegate I saw people mentioning paint methods. I know nothing about painting in PyQt and get quite scared when I see it mentioned. I really need to get over that.

Not to worry though, because it’s not needed…

Just subclass QStyledItemDelegate and have it take the variable date_format in its __init__ method:

class DateFormatDelegate(QStyledItemDelegate):
    def __init__(self, date_format):
        QStyledItemDelegate.__init__(self)        
        self.date_format = date_format

    def displayText(self, value, locale):
        return value.toDate().toString(self.date_format)

This way we can customise the date format without changing the class making it a little more portable. On your QTableView call setItemDelegateForColumn() and pass it your column index and a new instance of your subclassed QStyledItemDelegate with a date format:

self.tableResults.setItemDelegateForColumn(3,
    DateFormatDelegate('dd/MM/yyyy'))

Much easier than I expected.

Example Screenshot


Comments

comments powered by Disqus