根据QSortFilterProxyModel::lessThan()的Qt文档:
bool QSortFilterProxyModel :: lessThan(const QModelIndex&left,const QModelIndex&right)const [virtual protected]如果给定索引所引用的项目的值小于给定索引引用的项目的值,则返回true索引权限,否则返回false . 此函数在排序时用作<运算符,并处理以下QVariant类型:[... snip内置类型...]任何其他类型将使用QVariant :: toString()转换为QString .
QVariant::toString()的文档说:
QString QVariant :: toString()const如果变量具有type()String,Bool,ByteArray,Char,Date,DateTime,Double,Int,LongLong,StringList,Time,UInt或ULongLong,则将变量返回为QString;否则返回一个空字符串 .
我有一个用户定义的结构:
struct foo {
...
};
inline bool operator <(const foo& a, const foo& b) {
...
};
Q_DECLARE_METATYPE(foo)
我可以用这个来制作 QVariant
:
QVariant r;
r.setValue(foo());
return r;
但是,如果我返回这样的 QVariant
作为排序角色,那么基于上面的文档它赢得了't work - it' ll只是最终对空字符串进行排序 .
看起来我要做的就是保留与我为 foo
定义的_689704相同的顺序,为 foo
提供了一个字符串表示,它最终具有完全相同的排序顺序 .
这真的没有吸引力 . 它很笨重,涉及代码重复 . 还有别的办法吗?
1 回答
我相信我要做的是将
QSortFilterProxyModel
子类化并重载lessThan
以执行类似return sourceModel()->data(left).value<foo>() < sourceModel()->data(right).value<foo>();
的操作