Название: QDataTable - есть все-таки проблемка Отправлено: Kostya от Сентябрь 17, 2005, 14:19 Проблема: если QDataTable имеет достаточное количество строк (несколько экранов) и редактируется строка внизу таблицы - то при завершении редактирования происходит обновление таблицы и самое главное прокрутка таблицы в самый верх!
Как победить прокрутку чтобы таблица не прокручивалась а курсор оставался на редактируемой строке? Название: Решение Отправлено: Kostya от Сентябрь 26, 2005, 20:14 Итак, решение было найдено, если еому-нибудь интересно, но только с помощью небольшой правки исходников.
Проблема, понятно, в файле qt\3.3.4\src\sql\qdatatable.cpp. Комментарим две строки: line 2073 Код:
line 1822 Код:
после этого табличка не мигает и не скроллируется вверх. все нормально работает (пока) Название: 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 страхуется и перемещает указатель строк в самый верх и рисует скроллбар всегда. А в принципе, если следить за указателем и резко не менять количество строк в запросе - и без скачков вверх все прекрасно работает. |