首页 文章

有没有办法使用用户定义的运算符<for a struct来对QSortFilterProxyModel中该结构的QVariants进行排序?

提问于
浏览
0

根据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 回答

  • 1

    我相信我要做的是将 QSortFilterProxyModel 子类化并重载 lessThan 以执行类似 return sourceModel()->data(left).value<foo>() < sourceModel()->data(right).value<foo>(); 的操作

相关问题