Russian Qt Forum

Qt => Базы данных => Тема начата: Kostya от Сентябрь 17, 2005, 14:19



Название: QDataTable - есть все-таки проблемка
Отправлено: Kostya от Сентябрь 17, 2005, 14:19
Проблема: если QDataTable имеет достаточное количество строк (несколько экранов) и редактируется строка внизу таблицы - то при завершении редактирования происходит обновление таблицы и самое главное прокрутка таблицы в самый верх!
Как победить прокрутку чтобы таблица не прокручивалась а курсор оставался на редактируемой строке?


Название: Решение
Отправлено: Kostya от Сентябрь 26, 2005, 20:14
Итак, решение было найдено, если еому-нибудь интересно, но только с помощью небольшой правки исходников.
Проблема, понятно, в файле qt\3.3.4\src\sql\qdatatable.cpp. Комментарим две строки: line 2073
Код:

// d->lastAt = -1;


line 1822
Код:

// setNumRows(0);


после этого табличка не мигает и не скроллируется вверх. все нормально работает (пока)


Название: QDataTable - есть все-таки проблемка
Отправлено: Admin от Сентябрь 26, 2005, 20:44
напиши trolltech
может они скажут что делать

а исходники править не надо


Название: QDataTable - есть все-таки проблемка
Отправлено: Kostya от Сентябрь 27, 2005, 03:13
Цитата: "Admin"
напиши trolltech
может они скажут что делать

а исходники править не надо


Если внимательно посмотреть на метод где находится строка setNumRows(0); - все становится понятно, почему они это сделали, я работаю с Oracle, а у Oracle почему-то ::HasFeature(QuerySize)==FALSE, поэтому всегда рисуется вертикальный скроллбар и при каждом изменении курсора - таблица прокручивается вверх. Я их прикрасно понимаю, что они хотели сделать - перестраховаться от возможных багов, но при этом usability QDataTable резко падает, уж лучше я сам послежу за скроллбаром чем у меня таблица будет скакать по экрану.


Название: QDataTable - есть все-таки проблемка
Отправлено: LamerDrv от Сентябрь 27, 2005, 16:15
Цитата: "Kostya"
а у Oracle почему-то ::HasFeature(QuerySize)==FALSE


Некоторое время назад просмотривал исходные тексты драйверов СУБД в QT как раз на предмет HasFeature. Кажется ::HasFeature(QuerySize) равно FALSE во всех СУБД кроме postgresql. Насколько я понимаю HasFeature(QuerySize) равняется TRUE, если СУБД умеет сообщать число записей возвращаемых запросом. А большинство СУБД этого к сожалению не делают  :( (т.е. чтобы узнать число записей, приходиться все записи прочитать).

Кстати, у QSqlQueryModel есть баг связанный с обработкой перманентных индексов модели (хотя может в 4.0.1 пофиксили). Визуально он проявляется при подчитке записей из базы: т.е., когда скролишь грид до 255 записи и затем скролишь дальше должны быть подчитана следующая порция записей из базы. И в момент подчитки подсветка текущей записи улетает на самую верхнюю строку.
Похоже на твою ситуацию в том смысле что баг проявляется при добавление новых строк в самый низ грида.
Может кинешь мне пример где у тебя вылазит ошибочка?


Название: QDataTable - есть все-таки проблемка
Отправлено: Kostya от Сентябрь 27, 2005, 16:55
Цитата: "LamerDrv"
Цитата: "Kostya"
а у Oracle почему-то ::HasFeature(QuerySize)==FALSE

Может кинешь мне пример где у тебя вылазит ошибочка?


Во-первых - QT 3.3.4, QT 4 для баз данных - вообще не понравилась. Да не ошибка это, а просто некрасиво, редактируешь запись внизу таблицы - а при посте данных - таблица вверх самы улетает. При анализе кода qdatatable.cpp выясняется, что:
вызывается метод UpdateCurrent - отвечающий за изменение таблицы в базе - если неудачно - то продолжаем редактировать запись - иначе - делаем QDataTable::refresh
В refresh - ничего интересного не происходит и в конце вызывается QDataTable::setSize - а вот тут интересно: так как количество строк в принципе то неизвестно - то и непонятно - нужен ли скроллбар - и не выскочил ли текущий указатель строки за пределы строк. Поэтому: trolltech страхуется и перемещает указатель строк в самый верх и рисует скроллбар всегда. А в принципе, если следить за указателем и резко не менять количество строк в запросе - и без скачков вверх все прекрасно работает.