首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QSortFilterProxyModel按日期排序

QSortFilterProxyModel按日期排序
EN

Stack Overflow用户
提问于 2014-10-26 16:00:28
回答 3查看 6.4K关注 0票数 2

我想按日期对桌子进行排序。问题是它们被解释为字符串,因此我的本地日期格式被错误地排序,就像26. September16. November大,因为26 > 16

总之,我有我自己的模型,试着这样做:

代码语言:javascript
复制
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设置成这样:

代码语言:javascript
复制
proxyModel->setSortRole(Qt::UserRole);

实际上调用了相应的行,但现在我根本无法对表进行排序。只是没有反应。对应列上的箭头(表示asc或desc顺序)正在变化,但数据没有变化。,当然,我将其余的设置为:

代码语言:javascript
复制
proxyModel->setDynamicSortFilter(true);
proxyModel->setSourceModel(myDBModel);
proxyModel->setFilterKeyColumn(1);
proxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive);

如果不设置sortRole,至少可以根据其他列进行正确排序。我在这里做错什么了?我必须实现另一个函数或其他什么吗?我环顾了一下互联网,但我发现的只是数年前的整数排序问题,从来没有日期:

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-10-26 17:06:34

我是个白痴(事实!)

Qt已经提供了我所需要的一切,这对我来说只是一个愚蠢的错误。两件事,真的:

代码语言:javascript
复制
   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!
    }

我想感谢你的友好和快速的回答,但这一次在椅子和键盘之间存在问题。

票数 1
EN

Stack Overflow用户

发布于 2014-10-26 16:21:22

我认为您应该使用自定义排序/筛选模型。你应该“教”如何比较它。看一下这个例子:http://doc.qt.io/qt-5/qtwidgets-itemviews-customsortfiltermodel-example.html

我认为对你最有用的代码,你可以在这里找到:

代码语言:javascript
复制
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已经重载了操作符<

票数 1
EN

Stack Overflow用户

发布于 2014-10-26 16:21:51

根据QSortFilterProxyModel文档,您可以提供自己的lessThan()实现。http://doc.qt.io/qt-5/qsortfilterproxymodel.html#lessThan

如果由于某些原因不能像预期的那样工作,则如果使用ISO8601 (YYYY)格式化日期,则可以将日期排序为字符串。这就是我在处理数据库时通常选择存储(以及稍后排序)日期的方式。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26574923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档