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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Решено]QTableView/QSortFilterProxyModel: программное задание столбца сортировки  (Прочитано 4296 раз)
DarkHobbit
Самовар
**
Offline Offline

Сообщений: 189


Просмотр профиля
« : Июль 06, 2021, 20:14 »

Добрый день.
Есть QTableView, который ссылается на QSortFilterProxyModel, а та - на мою модель.
Сортировка работает, теперь захотелось запоминать выбранный пользователем столбец для сортировки и при следующем запуске программы активировать именно его.
У QTableView есть sortByColumn(). У QSortFilterProxyModel - sort() с теми же параметрами.
Если я вызываю QSortFilterProxyModel::sort(), сортировка по указанному столбцу происходит... но треугольничек в заголовке указывает не на него, а на первый столбец.
QTableView::sortByColumn() отрабатывает более логично.
Зато когда я извлекаю номер столбца, по которому сортировал сам пользователь, надо дёргать именно QSortFilterProxyModel::sortColumn(). У view я подобного метода не нашёл.
Всё вроде бы работает, но как-то это несимметрично и нелогично. Или я что-то не догнал?

Проверено на нескольких версиях Qt, последняя - 5.15.2.
« Последнее редактирование: Июль 14, 2021, 20:35 от DarkHobbit » Записан

Мои проекты на Qt: DoubleContact, LInvert
PimenS
Крякер
****
Offline Offline

Сообщений: 371


Просмотр профиля
« Ответ #1 : Июль 07, 2021, 03:46 »

Можно использовать void QHeaderView::setSortIndicator(int logicalIndex, Qt::SortOrder order).
Сохранять настройки можно по [signal] void QHeaderView::sortIndicatorChanged(int logicalIndex, Qt::SortOrder order).
Записан
DarkHobbit
Самовар
**
Offline Offline

Сообщений: 189


Просмотр профиля
« Ответ #2 : Июль 07, 2021, 10:25 »

Можно использовать void QHeaderView::setSortIndicator(int logicalIndex, Qt::SortOrder order).
Ещё и третий объект добавляется, отлично Улыбающийся)) Но он, как я понимаю, только индикацию включает, саму сортировку не меняет? Т.е. использовать его надо в паре с QSortFilterProxyModel::sort()?
Цитировать
Сохранять настройки можно по [signal] void QHeaderView::sortIndicatorChanged(int logicalIndex, Qt::SortOrder order).
А вот это ценное замечание. Я планировал сохранять настройки в обработчике closeEvent, извлекая информацию из QSortFilterProxyModel::sortColumn() и sortOrder(), но раз есть такой сигнал - логичнее использовать его, да.
Записан

Мои проекты на Qt: DoubleContact, LInvert
PimenS
Крякер
****
Offline Offline

Сообщений: 371


Просмотр профиля
« Ответ #3 : Июль 07, 2021, 14:30 »

Но он, как я понимаю, только индикацию включает, саму сортировку не меняет?

У меня меняет. Главное включить void QTableView::setSortingEnabled(bool enable)

void QTableView::sortByColumn(int column, Qt::SortOrder order) использую только в представлениях где не нужно сохранять настройки сортировки.
« Последнее редактирование: Июль 07, 2021, 14:33 от PimenS » Записан
DarkHobbit
Самовар
**
Offline Offline

Сообщений: 189


Просмотр профиля
« Ответ #4 : Июль 08, 2021, 00:43 »

Спасибо. Единственное, что пока не понял из справки - logicalIndex это то же самое, что column в других методах? Эксперименты показывают, что вроде как да...
Записан

Мои проекты на Qt: DoubleContact, LInvert
PimenS
Крякер
****
Offline Offline

Сообщений: 371


Просмотр профиля
« Ответ #5 : Июль 08, 2021, 12:54 »

logicalIndex это то же самое, что column в других методах?

Мне всегда казалось, что это одно и тоже.
Записан
DarkHobbit
Самовар
**
Offline Offline

Сообщений: 189


Просмотр профиля
« Ответ #6 : Июль 14, 2021, 20:35 »

Спасибо, всё работает.
Записан

Мои проекты на Qt: DoubleContact, LInvert
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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