Согласно документам Qt для QSortFilterProxyModel :: LessThan():
BOOL QSortFilterProxyModel ::меньше, чем(Const QModelIndex & оставил, Const QModelIndex & право) const
[virtual protected]
Возвращает true, если значение элемента, на которое ссылается данный индекс оставил меньше, чем значение элемента, на который ссылается данный индекс право, в противном случае возвращает false.
Эта функция используется как < оператор при сортировке и обрабатывает следующие QVariant типы:
[… обрезать встроенные типы …]Любой другой тип будет преобразован в QString с помощью QVariant :: ToString().
И документы для QVariant :: ToString() сказать:
QString QVariant ::нанизывать() const
Возвращает вариант в виде QString если вариант имеет тип() String, Bool, ByteArray, Char, Date, DateTime, Double, Int, LongLong, StringList, Time, UInt или ULongLong; в противном случае возвращает пустую строку.
У меня есть пользовательская структура:
struct foo {
...
};
inline bool operator <(const foo& a, const foo& b) {
...
};
Q_DECLARE_METATYPE(foo)
я могу сделать QVariant
s из этого:
QVariant r;
r.setValue(foo());
return r;
Однако, если я верну такой QVariant
тогда для роли сортировки, основанной на документах выше, это не будет работать — это просто закончится сортировкой по пустым строкам.
Похоже, что я должен сделать, чтобы сохранить тот же порядок, что и operator <
Я определил для foo
, это придумать строковое представление для foo
который заканчивается тем же порядком сортировки.
Это действительно непривлекательно. Это неуклюже и включает в себя дублирование кода. Есть ли другой путь?
Я считаю, что я должен сделать, это подкласс QSortFilterProxyModel
и перегрузка lessThan
сделать что-то вроде return sourceModel()->data(left).value<foo>() < sourceModel()->data(right).value<foo>();