Есть ли способ использовать пользовательский оператор & lt; для структуры, чтобы отсортировать QVariants этой структуры в QSortFilterProxyModel?

Согласно документам 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)

я могу сделать QVariants из этого:

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

Однако, если я верну такой QVariant тогда для роли сортировки, основанной на документах выше, это не будет работать — это просто закончится сортировкой по пустым строкам.

Похоже, что я должен сделать, чтобы сохранить тот же порядок, что и operator < Я определил для foo, это придумать строковое представление для foo который заканчивается тем же порядком сортировки.

Это действительно непривлекательно. Это неуклюже и включает в себя дублирование кода. Есть ли другой путь?

0

Решение

Я считаю, что я должен сделать, это подкласс QSortFilterProxyModel и перегрузка lessThan сделать что-то вроде return sourceModel()->data(left).value<foo>() < sourceModel()->data(right).value<foo>();

1

Другие решения


По вопросам рекламы [email protected]