C++ 基于两个排序角色的QSortFilterProxyModel排序?

C++ 基于两个排序角色的QSortFilterProxyModel排序?,c++,qt,qsortfilterproxymodel,C++,Qt,Qsortfilterproxymodel,在我的项目中,我在树视图中显示了一个模型。我使用QSortFilterProxyModel根据Qt::UserRole+1中设置的ID对模型进行排序。这将按“类型”划分我的列表(从使用的图标可以看出): 然而,我也希望每个“类型”按字母顺序排序。我最初试着先按字母顺序排序,然后按类型排序,看它是否能重新排列以正常工作,但它保持不变。有没有办法告诉我的程序使用两个排序角色进行排序,并确定哪一个“先走” 您需要对代理进行子类化并实现自己的代理 QSortFilterProxyModel使用虚拟的l

在我的项目中,我在树视图中显示了一个模型。我使用QSortFilterProxyModel根据Qt::UserRole+1中设置的ID对模型进行排序。这将按“类型”划分我的列表(从使用的图标可以看出):

然而,我也希望每个“类型”按字母顺序排序。我最初试着先按字母顺序排序,然后按类型排序,看它是否能重新排列以正常工作,但它保持不变。有没有办法告诉我的程序使用两个排序角色进行排序,并确定哪一个“先走”


您需要对代理进行子类化并实现自己的代理

QSortFilterProxyModel使用虚拟的
lessThan
方法来确定模型索引之间的顺序。只有
lessThan
的默认实现尊重
setSortRole
设置的角色。您可以覆盖它以提供自定义排序行为,在这种情况下,
setSortRole
已过时


官方文档中有一个关于自定义排序的部分以及一个代码示例:

由于我的重复URL被屏蔽,下面是经过一些小调整后的工作示例:

class MySortFilterProxyModel Q_DECL_FINAL : public QSortFilterProxyModel
{
    Q_OBJECT

public:
    MySortFilterProxyModel(QObject *parent)
        : QSortFilterProxyModel(parent)
    {
    }

protected:
    bool lessThan(const QModelIndex &left, const QModelIndex &right) const Q_DECL_OVERRIDE
    {
        QVariant leftData = sourceModel()->data(left);
        QVariant rightData = sourceModel()->data(right);
        // Do custom logic in here, e.g.:
        return QString::localeAwareCompare(leftData.toString(), rightData.toString()) < 0;
    }
};
class MySortFilterProxyModel Q_DECL_FINAL:public QSortFilterProxyModel
{
Q_对象
公众:
MySortFilterProxyModel(QObject*父对象)
:QSortFilterProxyModel(父级)
{
}
受保护的:
bool lessThan(常数QModelIndex&左,常数QModelIndex&右)常数Q_DECL_覆盖
{
QVariant leftData=sourceModel()->data(左);
QVariant rightData=sourceModel()->data(右);
//在此处执行自定义逻辑,例如:
返回QString::localeAwareCompare(leftData.toString(),rightData.toString())<0;
}
};

然后,这个自定义类通常会用来代替原来的类作为替换。就是这样

我需要做的就是创建另一个代理模型的代理模型。第一个代理按字母顺序排序,第二个代理按UserRole+1排序第一个代理

QSortFilterProxyModel* proxy = new QSortFilterProxyModel(ui->treeNBT);
proxy->setSourceModel(model);
proxy->setDynamicSortFilter(false);
proxy->sort(0, Qt::AscendingOrder);
proxy->setSortCaseSensitivity(Qt::CaseInsensitive);
proxy->setSortRole(Qt::DisplayRole);
QSortFilterProxyModel* proxy2 = new QSortFilterProxyModel(ui->treeNBT);
proxy2->setSourceModel(proxy);
proxy2->setDynamicSortFilter(false);
proxy2->sort(0, Qt::AscendingOrder);
proxy2->setSortRole(Qt::UserRole+1);
ui->treeNBT->setModel(proxy2);
比在重新实现的类中编写自定义排序逻辑简单得多。没有明显的性能影响,所以这就是我正在使用的

编辑:更改了我的答案。。。回顾我以前的问题,这不是最好的解决方法。重新实现课程是更好的(也是显而易见的)方法。哎呀

QSortFilterProxyModel* proxy = new QSortFilterProxyModel(ui->treeNBT);
proxy->setSourceModel(model);
proxy->setDynamicSortFilter(false);
proxy->sort(0, Qt::AscendingOrder);
proxy->setSortCaseSensitivity(Qt::CaseInsensitive);
proxy->setSortRole(Qt::DisplayRole);
QSortFilterProxyModel* proxy2 = new QSortFilterProxyModel(ui->treeNBT);
proxy2->setSourceModel(proxy);
proxy2->setDynamicSortFilter(false);
proxy2->sort(0, Qt::AscendingOrder);
proxy2->setSortRole(Qt::UserRole+1);
ui->treeNBT->setModel(proxy2);