Qt: Неправильная сортировка при использовании QSortFilterProxyModel в числовых строках и получении неверного текста столбца - PullRequest
3 голосов
/ 04 июля 2011

У меня есть простое представление дерева моделей с прокси QSortFilterProxyModel для сортировки столбцов и QStandardItemModel в качестве модели.
В каждом столбце есть строка, которая сортируется нормально, но в столбцах, которые содержат число (в виде строк), неправильная сортировка.
скажем, у меня есть 9,12,1 (каждое число в другом столбце, когда я сортирую их, я получаю 1,12,9 или 12,1,9, но никогда не в правильном порядке. как 1,9,12 или 12,9,1 почему?
также я замечаю, что когда я сортирую строку по столбцу, когда я пытаюсь получить текст нового столбца с помощью m_model->item(iSelectedRow,0)->text();
, я получаю исходный текст столбца, но никогда не сортирую новый текст столбца. Почему?

Ответы [ 3 ]

12 голосов
/ 04 июля 2011

Это потому, что по умолчанию QSortFilterProxyModel сортирует по DisplayRole. Если это возвращает строку, она будет сортировать строку. Чтобы отсортировать модель по какому-либо другому значению, определите пользовательскую роль сортировки в исходной модели и установите ее на прокси-сервере:

class MyModel {
   ...
   enum Role {
      SortRole=Qt::UserRole
   };
   QVariant data( ... ) const {
       ...
       switch ( role ) {
       case Qt::DisplayRole:
           return value as string;
       case SortRole:
           return value as int;
       }
   }
};

...
sortfilterproxy->setSortRole( MyModel::SortRole );

Ваш второй вопрос: что такое m_model? Исходная модель или sortfilterproxymodel? Первый никогда не изменяется при сортировке, сортировка происходит только в прокси.

3 голосов
/ 04 июля 2011

Если вы отсортируете строки «9», «12» и «1», вы получите «1», «12», «9» (лексикографическая сортировка).Если вы хотите, чтобы они были отсортированы по номерам, вы должны создать подкласс QSortFilterProxyModel и переопределить функцию-член lessThan, где вы можете просто использовать QString :: toInt ().

Вы можете узнать все это, изучив превосходные Документация Qt , где вы также найдете информацию о mapToSource (), mapFromSource (), mapSelectionToSource () и mapSelectionFromSource () для преобразования исходного QModelIndexes в отсортированные / отфильтрованные модельные индексы или наоборот.

1 голос
/ 09 декабря 2013

используйте QStandardItem :: setData () при заполнении таблицы, как показано ниже.Тогда все будет работать как положено.

ниже строк из документации Qt

virtual void QStandardItem::setData(const QVariant & value, int role = Qt::UserRole + 1)

Вот простое использование установленных данных.

item->setData(intData, Qt::DisplayRole);
...