Russian Qt Forum
Ноябрь 23, 2024, 08:40 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как сортировать модель по двум столбцам?  (Прочитано 6893 раз)
Odyssey
Гость
« : Ноябрь 27, 2012, 08:32 »

Допустим, у меня есть QSqlTableModel. Сортировку модели можно реализовать методом setSort, однако он ведь позволяет сортировать модель только по одному столбцу, правильно? Как быть, если нужно сделать сортировку по двум и более столбцам?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Ноябрь 27, 2012, 11:57 »

Навесь QSortFilterProxyModel с перегруженной lessThan().

Записан

Qt 5.11/4.8.7 (X11/Win)
Odyssey
Гость
« Ответ #2 : Ноябрь 27, 2012, 12:40 »

Спасибо!
А можно сопутствующую проблему объяснить? Отображаю отсортированную по setSort модель во вьюере - и никакой сортировки не происходит, даже после "принудительного" select() для модели. С чем это может быть связано?
Записан
Odyssey
Гость
« Ответ #3 : Ноябрь 28, 2012, 10:27 »

Дополнительный вопрос.

Как я понял, метод lessThan вызывается только тогда, когда происходит щелчок по заголовку столбца представления после
tableView->setSortingEnabled(true);

Вопрос 1: можно ли ограничить выбор столбцов, по которым происходит сортировка в представлении?
Вопрос 2: можно ли задать столбец сортировки представления "по умолчанию"? (Как я понимаю, вначале происходит автоматическая сортировка по столбцу с номером 0)?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #4 : Ноябрь 28, 2012, 13:29 »

1. в lessThan() проверять значение sortColumn()
2.
Код
C++ (Qt)
treeView->header()->setSortIndicator(1, Qt::AscendingOrder);
treeView->setSortingEnabled(true);
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Odyssey
Гость
« Ответ #5 : Ноябрь 28, 2012, 14:01 »

Спасибо, попробую!
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #6 : Ноябрь 28, 2012, 14:49 »

Допустим, у меня есть QSqlTableModel. Сортировку модели можно реализовать методом setSort, однако он ведь позволяет сортировать модель только по одному столбцу, правильно? Как быть, если нужно сделать сортировку по двум и более столбцам?
Когда-то писал для себя https://github.com/panter-dsd/QDBFRedactor/blob/master/src/core/dbfredactorsortfilterproxymodel.h
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
unkeep
Гость
« Ответ #7 : Май 30, 2013, 10:53 »

я сделал так:
2)в проксимодели добавляем какой-нибудь _secondarySortColumn (делаем его по умолчанию -1)
1)перегружаем lessThan
2)в lessеhan после
Код
C++ (Qt)
QVariant l = (left.model() ? left.model()->data(left, sortRole()) : QVariant());
   QVariant r = (right.model() ? right.model()->data(right, sortRole()) : QVariant());
добавляем
Код
C++ (Qt)
if (l == r && _secondarySortColumn != -1)
   {
       QModelIndex left2 = sourceModel()->index(left.row(),_secondarySortColumn,left.parent());
       QModelIndex right2 = sourceModel()->index(right.row(),_secondarySortColumn,right.parent());
       return lessThan(left2,right2);
   }

теперь, если  задать _secondarySortColumn  !=-1 будет сортировать с учётом вторичного столбца, если не задать, то как обычная сортировка
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.102 секунд. Запросов: 23.