crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> QTableView сортировка по нескольким колонкам одновременно и пример chap14 multisort из книги Земскова "Qt4 на примерах"
Steklova Olga
  опции профиля:
сообщение 14.6.2013, 18:02
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 27.9.2011
Из: Санкт-Петербург
Пользователь №: 2912

Спасибо сказали: 5 раз(а)




Репутация:   4  


Здравствуйте :)
Понадобилось мне в QTableView отобразить записи таблицы БД, но отсортировать их не по одной колонке, как я раньше делала, а по нескольким одновременно.
(Есть, например, в таблице поля A, B, C, D, F1, F2. Надо отсортировать записи по возрастанию значений поля A, записи с одинаковым А надо еще отсортировать по возрастанию B, с одинаковыми A и B - по возрастанию C, с одинаковыми A, B и C - по возрастанию D.)

В книге Земскова есть пример multisort для QTableWidget. Там оператор, щелкая по заголовкам столбцов в том порядке, в каком хочет, выбирает, по каким колонкам надо отсортировать таблицу и как сортировать: по возрастанию или убыванию.

Мне в программе пока не требуется, чтобы оператор выбирал, по каким полям сортировать таблицу. Мне надо жестко задать сортировку таблицы по возрастанию полей A, B, C, D.
Как это сделать для QTableView?
Не хочется использовать QTableWidget, у меня везде в программе используются QTableView, для которых установлены модели. А у QTableWidget нет метода setModel, есть только setItem.

У меня, пока что, только одно предложение, как это можно сделать, но, по-моему, не самое удачное:
Поля A, B, C, D у меня целые, при этом я знаю, сколько цифр максимально могут содержать эти поля (A - max 4 цифры, B - 3, C - 1, D - 1). Если сделать вычисляемое поле F_AAAABBBCD и записать туда A*10000 + B*100 + C*10 + D, то отсортировав таблицу по возрастанию этого поля, получим сортировку по полям A, B, C, D.
Есть другие предложения? :rolleyes:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Steklova Olga
  опции профиля:
сообщение 17.6.2013, 11:23
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 27.9.2011
Из: Санкт-Петербург
Пользователь №: 2912

Спасибо сказали: 5 раз(а)




Репутация:   4  


Цитата(Litkevich Yuriy @ 15.6.2013, 14:36) Link
См. Модели-посредники -> Пользовательские модели сортировки
эта ссылка не работает, вот точнее Link
Но я еще не разобралась, как использовать QSortFilterProxyModel.

Цитата(Litkevich Yuriy @ 15.6.2013, 14:36) Link
если первичная модель выбирает данные из БД, то нужно делать от неё наследника, т.к. БД возвращает не все данные (их может быть слишком много), а выдаёт их порциями.
В наследнике реализовать:
- либо запрос с сортировкой
- либо добавить собственную функцию для задания полей сортировки, например: setOrderField(QStringList), и при вызове select() у модели использовать эти поля.
извините, ничего не поняла

Предлагаю другой вариант. Если не использовать QSortFilterProxyModel, то, наверное, вот что можно сделать.
Я использую модель MyModel, унаследованную от QSqlTableModel, переопределяю в ней методы flags, data, setData. Эта модель позволяет указывать setSort только для одного поля таблицы.
Можно унаследовать модель MyModel не от QSqlTableModel, а от QSqlQueryModel. Такая модель позволит указать в setQuery сортировку по нескольким полям одновременно:
model = new MyModel(this);
model->setQuery("SELECT * FROM T_OBJ ORDER BY A, B, C, D");
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 13.12.2025, 15:58