Сортировка столбцов по алфавиту в QStandardItemModel: QSortFilterProxyModel

Я пытаюсь отсортировать элементы в определенном столбце QStandardItemModel в алфавитном порядке.
Для этого я использую класс, производный от QSortFilterProxyModel и я реализую lessThan метод как таковой

bool MyProxy::lessThan(const QModelIndex &left, const QModelIndex &right) const
{

QVariant leftData = sourceModel()->data(left);
QVariant rightData = sourceModel()->data(right);

if( left.column() == 1)
{
return leftData.toString() < rightData.toString();
}

return false;
}

Вот как я прикрепляю модель к модели прокси

MyStandardItemModel=new QStandardItemModel();
MyProxy= new MyProxy();

MyProxy->setSourceModel(pModelContacts);
ui.ContactView->setModel(MyProxy);

После добавления элементов в модель вот что я делаю для сортировки

MyProxy->sort(1);

Однако столбец не отображается отсортированным. Какие-либо предложения?

2

Решение

Я бы заменил эту строку:

  return leftData.toString() < rightData.toString();

с этим согласно официальному пример пользовательской модели сортировки / фильтрации:

  return QString::localeAwareCompare(leftData.toString(), leftData.rightString()) < 0;

Преимущество состоит в том, что он будет правильно обрабатывать строку для локали пользователя в соответствии с документацией.

int QString :: localeAwareCompare (const QString & другое) const

Эта функция перегружает localeAwareCompare ().

Сравнивает эту строку с другой строкой и возвращает целое число меньше, равно или больше нуля, если эта строка меньше, равна или больше, чем другая строка.

Сравнение выполняется в зависимости от языка и платформы. Используйте эту функцию для представления отсортированных списков строк пользователю.

То же, что и localeAwareCompare (* это, другое).

Тем не менее, я бы лично использовал перечисление порядка сортировки для этой задачи согласно документация:

enum Qt :: SortOrder

По возрастанию…

Qt :: AscendingOrder 0

Элементы сортируются по возрастанию, например начинается с ‘AAA’ и заканчивается на ‘ZZZ’ в латинице 1

Нисходящее …

Qt :: DescendingOrder 1

Элементы сортируются по убыванию, например начинается с ‘ZZZ’ и заканчивается ‘AAA’ в латинице 1

Таким образом, этой строки было бы достаточно без переопределения метода lessThan, потому что порядок сортировки по умолчанию возрастает, и это похоже на то, что ваш код пытается переопределить.

MyProxy->sort(1);
1

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

Других решений пока нет …

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