如何在 QTableView 中排序和更改日期格式

How to sort and change date format in QTableView

我已经在 Qt5 中实现了 QTableView + QStandardItemModel。一开始,我根据应用程序设置将日期数据设置为具有日期格式的字符串。例如,它可以是美国格式 MM/dd/yyyy 或欧洲格式 dd.MM.yyyy。数据来自具有欧洲日期格式的 json 文件。我的第一个实现是这样的:

shared_ptr<QStandardItemModel> _model;
// detect a date string with regex, get the submatches and create a QDate object from it
QDate date(stoi(submatches[3].str()), stoi(submatches[2].str()), stoi(submatches[1].str()));

QModelIndex index = _model->index(rowPos, colPos, QModelIndex());
// depends on the setting, the date can be shown on the table like this
_model->setData(index, QString(date.toString("dd.MM.yyyy"));

// activate the column sorting in the QTableView
ui->tableView->setSortingEnabled(true);

但是,此实现无法正确排序日期列。原因是因为 QTableView 像字符串一样对列进行排序(按天排序而不是先按年排序)而不是日期条目。

我可以通过直接使用日期对象设置数据来更改实现:

_model->setData(index, date);

按日期排序完美无缺。但是,格式现在始终以 dd/MM/yyyy 格式显示。 如何保留此排序功能,但根据日期格式设置更改日期视图?

我读到它可以使用 QAbstractTableModel 的自定义子类来实现。作为 QTableView 的子类实现怎么样?或者可能与 中的 QAbstractItemModel 的子类一起使用?我还不是实施和集成 Qt5 子类的专家。

解决方案是将QDate作为数据传递给模型,并使用委托进行设置,如视图所示:

_model->setData(index, date);
class DateDelegate: public QStyledItemDelegate{
public:
    using QStyledItemDelegate::QStyledItemDelegate;
    QString displayText(const QVariant &value, const QLocale &locale) const{
        return locale.toString(value.toDate(), "dd.MM.yyyy");
    }
};
ui->tableView->setItemDelegateForColumn(col_date, new DateDelegate);