Я пытаюсь отсортировать элементы в определенном столбце 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);
Однако столбец не отображается отсортированным. Какие-либо предложения?
Я бы заменил эту строку:
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);
Других решений пока нет …