根据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
提供了一个字符串表示形式,最终得到了完全相同的排序顺序。
这真的没什么吸引力。它很笨重,涉及代码重复。还有其他办法吗?
答案 0 :(得分:1)
我相信我要做的是继承QSortFilterProxyModel
并重载lessThan
来做return sourceModel()->data(left).value<foo>() < sourceModel()->data(right).value<foo>();