[PyQt] SystemLocaleShortDate omits the century on Linux

Maurizio Berti maurizio.berti at gmail.com
Fri Mar 13 21:23:49 GMT 2020


As far as I know, Unix "date +%x" returns the locale d_fmt, which is not
necessarily the "shortest" form.
I believe that Qt relies on its own "super-set" of localizations, but I'm
just guessing.

About your second question, you don't have to necessarily use a delegate,
and subclassing is usually enough.
If you're using a QStandardItemModel, you only have to subclass it and
override data(): if the source data is actually a QDate, return the format
that better suits your needs.

Since you'll probably use a database as a source for the model, using
QIdentityProxyModel is usually much better.
In this example I'll fill a simple table with a date column, and a subclass
of QIdentityProxyModel returns the data in the selected format whenever a
DisplayRole returns a QDate.

In this way you don't need a delegate, if not for the editor; I also added
a "companion" delegate for the proxy, so that if it is going to show a
QDateEdit and the model is the proxy, it will use the same format set for
it.

class DateProxyModel(QtCore.QIdentityProxyModel):
    def dateFormat(self):
        try:
            return self._dateFormat
        except:
            return QtCore.QLocale().dateFormat(QtCore.QLocale.ShortFormat)

    def setDateFormat(self, fmt=''):
        if not fmt:
            del self._dateFormat
        else:
            self._dateFormat = fmt
        # the date format has changed, notify all connected views about that
        self.dataChanged.emit(QtCore.QModelIndex(), QtCore.QModelIndex())

    def data(self, index, role=QtCore.Qt.DisplayRole):
        data = super().data(index, role)
        if role == QtCore.Qt.DisplayRole and isinstance(data, QtCore.QDate):
            return data.toString(self.dateFormat())
        return data


class DateProxyDelegate(QtWidgets.QStyledItemDelegate):
    def createEditor(self, parent, option, index):
        editor = super().createEditor(parent, option, index)
        if isinstance(editor, QtWidgets.QDateEdit) and
isinstance(index.model(), DateProxyModel):
            editor.setDisplayFormat(index.model().dateFormat())
        return editor


class Test(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        layout = QtWidgets.QVBoxLayout(self)

        formatEdit = QtWidgets.QLineEdit()
        layout.addWidget(formatEdit)

        table = QtWidgets.QTableView()
        layout.addWidget(table)

        model = QtGui.QStandardItemModel()
        model.setHorizontalHeaderLabels(['Date', 'Something'])

        for row in range(10):
            dateItem = QtGui.QStandardItem()
            d = QtCore.QDate(randrange(2000, 2021), randrange(1, 13),
randrange(1, 29))
            dateItem.setData(d, QtCore.Qt.DisplayRole)
            model.appendRow([dateItem, QtGui.QStandardItem('something')])

        proxy = DateProxyModel()
        proxy.setSourceModel(model)
        table.setModel(proxy)

        dateDelegate = DateDelegate()
        table.setItemDelegate(dateDelegate)

        formatEdit.setPlaceholderText(proxy.dateFormat())
        formatEdit.textChanged.connect(proxy.setDateFormat)


Cheers,
Maurizio

Il giorno ven 13 mar 2020 alle ore 15:48 Sibylle Koczian <
nulla.epistola at web.de> ha scritto:

> Am 11.03.2020 um 20:47 schrieb Maurizio Berti:
> > It completely depends on how the system "tells" what is the date format.
> > Apparently, Windows defaults to 4 digits for your localization, while
> > it's set to 2 for Linux.
>
> So I thought too, but then why does "date +%x", which should show "the
> locale's date representation", give all 4 digits? This is very confusing.
>
> > You can change them in both systems: in Windows it's on the regional
> > settings, while on Linux it depends on your distro/window manager/etc.
> >
>
> In this case Windows does it right. I'll have yet to find the right
> setting for Linux. But in the meantime: if I want a QTableView to render
> QDate values in another format, a custom delegate is the way to go,
> right? But which method? All the examples I've seen for overwritten
> paint() methods seem unnecessary complicated for this sort of small change.
>
> Sibylle
>
> _______________________________________________
> PyQt mailing list    PyQt at riverbankcomputing.com
> https://www.riverbankcomputing.com/mailman/listinfo/pyqt
>


-- 
È difficile avere una convinzione precisa quando si parla delle ragioni del
cuore. - "Sostiene Pereira", Antonio Tabucchi
http://www.jidesk.net
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://www.riverbankcomputing.com/pipermail/pyqt/attachments/20200313/bfa6ca1f/attachment.htm>


More information about the PyQt mailing list