我想按日期对表格进行排序。问题是它们被解释为字符串,因此我的本地日期格式排序错误,比如26. September
比16. November
大,因为26 > 16
。
不管怎样,所以我建立了自己的模型,并这样尝试:
QVariant MyModel::data(const QModelIndex &index, int role) const
{
if(role == Qt::UserRole)
{
if(index.column() == 5) // Date
return QSqlTableModel::data(index, role).toDate();
}
if(role == Qt::DisplayRole)
{
if(index.column() == 5) // Date
return QSqlTableModel::data(index.role).toDate().toString("dd MMMM yyyy");
}
}
我把sortRole
设置成这样:
proxyModel->setSortRole(Qt::UserRole);
实际上调用了相应的行,但现在我根本无法对表进行排序。它只是没有回应。相应列的箭头(表示asc或desc排序)正在更改,但数据没有更改。当然,我将其他设置为:
proxyModel->setDynamicSortFilter(true);
proxyModel->setSourceModel(myDBModel);
proxyModel->setFilterKeyColumn(1);
proxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive);
如果我不设置sortRole
,至少我可以正确地按其他列排序。我在这里做错了什么?我必须实现另一个功能吗?我在互联网上查找了一下,但我发现的只是对几年前的整数进行排序的问题,而不是日期:(
我是个白痴(事实!)
Qt已经提供了我所需要的一切,这对我来说只是一个愚蠢的错误。实际上有两件事:
if(role == Qt::UserRole)
{
if(index.column() == 5)
return QDate::fromString(QSqlTableModel::data(index, Qt::DisplayRole).toString(), "yyyy-MM-dd"); // 1st Mistake, no correct conversion. I always got QVariant(invalid)
// 1.1 Mistake, also, grab the data from Qt::DisplayRole, not from Qt::UserRole!
return QSqlTableModel::data(index, Qt::DisplayRole); // 2nd Mistake. Because I didn't add that line I couldn't sort it on any other column anymore. When I finally could sort it on the dates I couldn't on the other columns, then I thought about adding this line et voila!
}
我想感谢你的善意和快速的回答,但这次椅子和键盘之间存在问题。
根据QSortFilterProxyModel文档,您可以提供自己的lessTan()实现。http://doc.qt.io/qt-5/qsortfilterproxymodel.html#lessThan
如果由于某种原因无法按预期工作,如果使用ISO8601(YYYY-MM-DD)格式化日期,则可以始终将日期排序为字符串。这就是我在处理数据库时通常选择存储(以及稍后排序)日期的方式。
我认为您应该使用自定义排序/筛选模型。你应该"教"课堂如何进行比较。看看这个例子:http://doc.qt.io/qt-5/qtwidgets-itemviews-customsortfiltermodel-example.html
我认为对你来说最有用的代码,你可以在这里找到:
bool MySortFilterProxyModel::lessThan(const QModelIndex &left,
const QModelIndex &right) const
{
QVariant leftData = sourceModel()->data(left);
QVariant rightData = sourceModel()->data(right);
if (leftData.type() == QVariant::DateTime)
return leftData.toDateTime() < rightData.toDateTime();
}
QDateTime
已经具有过载的运算符<
。