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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Вопросы по QTableView  (Прочитано 14200 раз)
PavelVX
Гость
« : Июль 20, 2011, 09:44 »

Добрый день всем!
1. В QTableView можно показать, скрыть колонки. А как мне просто поменять местами колонки? У меня с базы приходит все в определенном порядке, а в разных формах показывать надо по разному. Грустный
2. Сортировки: tableView->setSortingEnabled(true); (QSqlQueryModel)
2а. появились треугольнички, но если на них нажимать, то порядок сортировки не меняется.
2б. Можно ли как-то самому для конкретных колонок указывать по какому столбцу их сортировать?
« Последнее редактирование: Январь 10, 2012, 10:26 от Пантер » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #1 : Июль 20, 2011, 09:47 »

Тебе нужна QSortFilterProxyModel.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Kolobok
Гость
« Ответ #2 : Июль 20, 2011, 09:56 »

1.  QTableView::horizontalHeader()::moveSection ( int from, int to )
Записан
Странник
Гость
« Ответ #3 : Июль 20, 2011, 13:05 »

2б. QTableView::sortByColumn(int column, Qt::SortOrder order).

Тебе нужна QSortFilterProxyModel.
на небольших объемах работает неплохо, на выборках побольше тормозит нещадно. возможно, придется реализовывать sort() для модели самостоятельно.

меня еще интересует, как разрешить пользователю менять порядок столбцов drag-n-drop'ом. установка tableView->horizontalHeader()->setMovable(true) не помогает, есть еще что-то?
« Последнее редактирование: Июль 20, 2011, 13:07 от Странник » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #4 : Июль 20, 2011, 13:52 »

Почему у меня прокся с 19000 строк не тормозила?
Записан
Странник
Гость
« Ответ #5 : Июль 20, 2011, 14:02 »

Почему у меня прокся с 19000 строк не тормозила?
интересно. у меня бобик дох на сортировке по строковому столбцу уже при ~5000 записей, даже на шустрой машинке. пойду эксперементировать.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


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

ну я 1 колонку фильтровал через startsWith. Покажите, как фильтруете.
Записан
Странник
Гость
« Ответ #7 : Июль 21, 2011, 10:40 »

ну я 1 колонку фильтровал через startsWith. Покажите, как фильтруете.
фильтры по StartsWith работают нормально, тормоза замечены только на FixedString. но я про сортировку говорил, там вроде негде накосячить:
Код:
QSqlQueryModel *model = new QSqlQueryModel;

QSortFilterProxyModel *proxyModel = new QSortFilterProxyModel;
proxyModel->setDynamicSortFilter(true);
proxyModel->setSourceModel(model);

QTableView *tableView = new QTableView;
tableView->setSortingEnabled(true);
tableView->setModel(proxyModel);

увы и ах, уже при ~150 записях заметная задержка, сделал сортировку на сервере.
Записан
PavelVX
Гость
« Ответ #8 : Июль 22, 2011, 05:24 »

а можно как-то перехватывать нажатия на значек сортировок?
если модель QSqlQueryModel, tableView->setSortingEnabled(true);
то при нажатии на треугольнички сортировка не происходит. Вот это бы нажатие и перехватывать. Тогда можно было бы как угодно извращать сортировки. Типа раз нажали на 5 колонку, то и сортируем по нужному столбцу.
Кстати, возвращаясь к сортировкам: типы сортировок можно как-то указывать? Или сортировка всегда отдается на сервер, если вы данные берете с сервера? Просто с сортировкам на сервере есть и минус: на постгре серваках линуксовых сортировка не учитывает пробелы и прочие спецсимволы, что очень неудобно.
Записан
Странник
Гость
« Ответ #9 : Июль 22, 2011, 09:12 »

после нажатия на треугольничек вызывается функция sort(int column, Qt::SortOrder order) модели. переопределяйте и сортируйте - хотите белочку, хотите зайчика.
« Последнее редактирование: Июль 22, 2011, 09:14 от Странник » Записан
PavelVX
Гость
« Ответ #10 : Июль 22, 2011, 10:27 »

оффтоп: нас тут вином угостили, у человека праздник. И тут я читаю про белочку ... в начале даже не понял про какую идет речь, вроде по чуть-чуть совсем выпили. Улыбающийся
По существу: ламерский вопрос, поисковик не помогает, разбирать sql строку запроса считаю неправильным.
А как мне по номеру колонки из QSqlQueryModel вытащить имя самой колонки?
void TestModel::sort(int column, Qt::SortOrder order) //наследник от QSqlQueryModel
{
//тут как-то надо по номеру вытащить название, что бы в refresh правильно прописать order by
}
Или это как-то по другому делается
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #11 : Июль 22, 2011, 10:52 »

headerData() ?
Записан

Изучением 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
Странник
Гость
« Ответ #12 : Июль 22, 2011, 11:03 »

в headerData() может храниться произвольный текст. имя колонки можно узнать в QSqlQueryModel::record().fieldName(int index).
Записан
PavelVX
Гость
« Ответ #13 : Июль 22, 2011, 11:05 »

в headerData() указывается ваше название, которое может не совпадать с основным!
Хмм, пока писал, Странник уже ответил Улыбающийся
Странник СПАСИБО!
Похоже создав несколько форм и поднакопив опыт удобнее будет написать свою модель и основывать на ней свои формы.
« Последнее редактирование: Июль 22, 2011, 11:10 от PavelVX » Записан
Danila_Bagrofff
Гость
« Ответ #14 : Декабрь 22, 2011, 20:20 »

Снова хочу поднять эту тему. Встал вопрос сортировок более глобально.
Если работа с базами данных ведется активно, есть много пользователей, читающих данные из больших таблиц, то запросы с условием order by начинают грузить сервер, создавать блокировки на изменение данных в таблицах и т.д.
Условие order by заставляет всегда прочитать всю таблицу для данной сессии в память. Если у вас используются joinы плюсуйте и эти таблицы. Каждый клиент при работе с бд заставляет заново перечитывать таблицу и держать в кэше все эти данные, загружая сервак. А если данные еще и пишутся в эти таблицу - то тут поднимаются еще и опросы блокировок или актуальности данных на момент чтения. Операция сортировки зачастую может составлять до 90% всего времени запроса. Чем больше эта таблица - тем дольше проходит сортировка.
В общем получается так, что иногда проще выполнять сортировку на клиенте, чтобы меньше загружать сервер БД.

Весь вопрос упирается в то, где все-таки лучше делать сортировку.
С одной стороны лучше на клиенте:
-если вы уверены, что данные не изменились, или они в БД доступны только для чтения
- что загружать сервер БД - критично, существует много обращений на запись
- если таблицы относительно невелики, гонять по сети большие таблицы - тоже не есть гут.

Лучше делать на сервере order by.
- если мало постоянных изменений, и больше чтения, и чтения не так уж и много.
- если таблица очень большая и сортировка на клиенте явно менее производительнее.

Теперь вопрос, как действительно бы лучше делать сортировку данных именно на клиенте?
- строковых
- данных
- целых

Какие механизмы самые оптимальные? Может, есть коды?
« Последнее редактирование: Декабрь 23, 2011, 17:21 от Danila_Bagrofff » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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