如何在 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);
我已经在 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);