Сортировка столбца по алфавиту в 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); 

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


person MistyD    schedule 12.01.2014    source источник


Ответы (1)


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

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

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

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

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

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

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

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

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

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

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

перечисление Qt::SortOrder

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

Qt::По возрастанию 0

Элементы сортируются по возрастанию, т.е. начинается с «AAA» заканчивается «ZZZ» в локалях Latin-1

По убыванию...

Qt::DescendingOrder 1

Элементы отсортированы по убыванию, т.е. начинается с «ZZZ» заканчивается «AAA» в локалях Latin-1

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

MyProxy->sort(1);
person lpapp    schedule 12.01.2014
comment
Спасибо Лазло. Я знаю, что мог бы просто сделать это, но я пытаюсь работать с FilterProxyModel. - person MistyD; 12.01.2014
comment
Спасибо, это сработало. Можно также объяснить, почему мой метод не работает? - person MistyD; 12.01.2014
comment
Исправление опечатки: localeAwareCompare(leftData.toString(), rightData.toString()) ‹ 0; - person bop; 24.10.2017