Russian Qt Forum

Qt => Базы данных => Тема начата: Odyssey от Ноябрь 27, 2012, 08:32



Название: Как сортировать модель по двум столбцам?
Отправлено: Odyssey от Ноябрь 27, 2012, 08:32
Допустим, у меня есть QSqlTableModel. Сортировку модели можно реализовать методом setSort, однако он ведь позволяет сортировать модель только по одному столбцу, правильно? Как быть, если нужно сделать сортировку по двум и более столбцам?


Название: Re: Как сортировать модель по двум столбцам?
Отправлено: GreatSnake от Ноябрь 27, 2012, 11:57
Навесь QSortFilterProxyModel с перегруженной lessThan().



Название: Re: Как сортировать модель по двум столбцам?
Отправлено: Odyssey от Ноябрь 27, 2012, 12:40
Спасибо!
А можно сопутствующую проблему объяснить? Отображаю отсортированную по setSort модель во вьюере - и никакой сортировки не происходит, даже после "принудительного" select() для модели. С чем это может быть связано?


Название: Re: Как сортировать модель по двум столбцам?
Отправлено: Odyssey от Ноябрь 28, 2012, 10:27
Дополнительный вопрос.

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

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


Название: Re: Как сортировать модель по двум столбцам?
Отправлено: kambala от Ноябрь 28, 2012, 13:29
1. в lessThan() проверять значение sortColumn()
2.
Код
C++ (Qt)
treeView->header()->setSortIndicator(1, Qt::AscendingOrder);
treeView->setSortingEnabled(true);


Название: Re: Как сортировать модель по двум столбцам?
Отправлено: Odyssey от Ноябрь 28, 2012, 14:01
Спасибо, попробую!


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


Название: Re: Как сортировать модель по двум столбцам?
Отправлено: unkeep от Май 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 будет сортировать с учётом вторичного столбца, если не задать, то как обычная сортировка