有没有办法使用用户定义的运算符<用于在QSortFilterProxyModel中对该结构的QVariant进行排序的结构?

时间:2015-08-12 21:41:17

标签: c++ qt sorting qsortfilterproxymodel

根据QSortFilterProxyModel::lessThan()的Qt文档:

  

bool QSortFilterProxyModel :: lessThan (const QModelIndex& left ,const QModelIndex& )const [virtual protected]

     

如果给定索引 left 引用的项的值小于给定索引 right 引用的项的值,则返回true,否则返回假的。

     

此功能用作<运算符排序时,处理以下QVariant类型:

     

[...剪切内置类型...]

     

任何其他类型都将使用QString()转换为QVariant::toString

QVariant::toString()的文档说:

  

QString QVariant :: toString ()const

     

如果变体具有QString()String,Bool,ByteArray,Char,Date,DateTime,Double,Int,LongLong,StringList,Time,UInt或ULongLong,则将变量返回为type ;否则返回一个空字符串。

我有一个用户定义的结构:

struct foo {
    ...
};

inline bool operator <(const foo& a, const foo& b) { 
    ...
};

Q_DECLARE_METATYPE(foo)

我可以通过以下方式制作QVariant

QVariant r; 
r.setValue(foo());
return r;

但是,如果我为排序角色返回这样的QVariant,那么基于上面的文档它将无法工作 - 它只会最终对空字符串进行排序。

似乎我要做的就是保留与我为operator <定义的foo相同的顺序,为foo提供了一个字符串表示形式,最终得到了完全相同的排序顺序。

这真的没什么吸引力。它很笨重,涉及代码重复。还有其他办法吗?

1 个答案:

答案 0 :(得分:1)

我相信我要做的是继承QSortFilterProxyModel并重载lessThan来做return sourceModel()->data(left).value<foo>() < sourceModel()->data(right).value<foo>();

之类的事情。