无法使用 QSortFilterProxyModel 按角色排序按 QDateTime 对模型进行排序

Posted

技术标签:

【中文标题】无法使用 QSortFilterProxyModel 按角色排序按 QDateTime 对模型进行排序【英文标题】:Can't sort model by QDateTime with using QSortFilterProxyModel sort by role 【发布时间】:2021-10-01 21:28:35 【问题描述】:

我遇到了一个简单的问题,但我不明白为什么我的模型没有排序。 我有继承自 QAbstractListModelSimpleModel 类,我想按 DateTime 角色对其进行排序。

这就是我在main.cpp 中设置代理的方式:

SimpleModel m;
ProxyModel proxyModel;
proxyModel.setSourceModel(&m);
proxyModel.setSortRole(SimpleModel::SimpleRoles::DateTimeRole);
engine.rootContext()->setContextProperty("simpleModel", &proxyModel);

SimpleModel 中的我的项目是来自 SimpleItem 类的对象,它只有名称和日期时间。这是我的 SimpleModel 数据方法:

QVariant SimpleModel::data(const QModelIndex &index, int role) const

    if(!index.isValid()) 
        return QVariant();
    

    auto simpleItem = static_cast<SimpleItem*>(index.internalPointer());
    if (!simpleItem) 
        return QVariant();
    

    if(role == NameRole) 
        return simpleItem->name();
    
    //This is used for displaying in QML
    else if(role == DateRole) 
        return simpleItem->dateTime().toString("yyyy-MM-dd");
    
    // This is used for dsiplaying in QML too
    else if(role == TimeRole) 
        return simpleItem->dateTime().toString("hh:mm");
    
    // This Role is only used for sorting
    else if(role == DateTimeRole) 
        return simpleItem->dateTime();
    

    return QVariant();

在继承自 QSortFilterProxyModel 类的 ProxyModel 中,我实现了lessThan()methood,但它从未被调用:

bool ProxyModel::lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const

    qDebug() << "called lessThan()";
    QVariant leftData = sourceModel()->data(source_left);
    QVariant rightData = sourceModel()->data(source_right);

    if (leftData.userType() == QMetaType::QDateTime)
            return leftData.toDateTime() < rightData.toDateTime();

    return false;

我做错了什么或者你有什么想法我可以尝试吗?如果您需要更多代码,我会更新。 提前致谢。

【问题讨论】:

1.请提供minimal reproducible example 2. 你调用过sort方法吗? @eyllanesc 非常感谢,在setSortRole 之后调用proxyModel.sort(0, Qt::DescendingOrder); 后它可以工作,你可以将其发布为答案以便我标记它吗? 自定义的 ProxyModel 没用。一个普通的 QSortFilterProxyModel 也在做同样的事情。 @chehrlic 在示例中是的,但是我正在处理对模型项目的点击,所以我需要实现 itemAt() 方法,该方法将从源模型映射点击的项目。 仍然没有什么是普通的 QSortFilterProxyModel 做不到的——仍然不需要自定义的。 【参考方案1】:

如你所说

它在调用 proxyModel.sort(0, Qt::DescendingOrder); 后起作用在 setSortRole 之后

【讨论】:

以上是关于无法使用 QSortFilterProxyModel 按角色排序按 QDateTime 对模型进行排序的主要内容,如果未能解决你的问题,请参考以下文章

无法访问您试图使用的功能所在的网络位置

无法使用 StorageClass 配置卷 - 无法获取存储帐户的存储密钥

Worklight Studio 和本地开发,有时无法使用 Java 类,有时无法使用 HTML 文件

ADB无法使用解决办法

Ubuntu 80端口无法使用-非root用户无法使用1024以下端口

无法在 SQL Server 视图中使用工作查询:“IS”无法识别“>”无法识别