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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QDataTable - есть все-таки проблемка  (Прочитано 5660 раз)
Kostya
Гость
« : Сентябрь 17, 2005, 14:19 »

Проблема: если QDataTable имеет достаточное количество строк (несколько экранов) и редактируется строка внизу таблицы - то при завершении редактирования происходит обновление таблицы и самое главное прокрутка таблицы в самый верх!
Как победить прокрутку чтобы таблица не прокручивалась а курсор оставался на редактируемой строке?
Записан
Kostya
Гость
« Ответ #1 : Сентябрь 26, 2005, 20:14 »

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

// d->lastAt = -1;


line 1822
Код:

// setNumRows(0);


после этого табличка не мигает и не скроллируется вверх. все нормально работает (пока)
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #2 : Сентябрь 26, 2005, 20:44 »

напиши trolltech
может они скажут что делать

а исходники править не надо
Записан
Kostya
Гость
« Ответ #3 : Сентябрь 27, 2005, 03:13 »

Цитата: "Admin"
напиши trolltech
может они скажут что делать

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


Если внимательно посмотреть на метод где находится строка setNumRows(0); - все становится понятно, почему они это сделали, я работаю с Oracle, а у Oracle почему-то ::HasFeature(QuerySize)==FALSE, поэтому всегда рисуется вертикальный скроллбар и при каждом изменении курсора - таблица прокручивается вверх. Я их прикрасно понимаю, что они хотели сделать - перестраховаться от возможных багов, но при этом usability QDataTable резко падает, уж лучше я сам послежу за скроллбаром чем у меня таблица будет скакать по экрану.
Записан
LamerDrv
Гость
« Ответ #4 : Сентябрь 27, 2005, 16:15 »

Цитата: "Kostya"
а у Oracle почему-то ::HasFeature(QuerySize)==FALSE


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

Кстати, у QSqlQueryModel есть баг связанный с обработкой перманентных индексов модели (хотя может в 4.0.1 пофиксили). Визуально он проявляется при подчитке записей из базы: т.е., когда скролишь грид до 255 записи и затем скролишь дальше должны быть подчитана следующая порция записей из базы. И в момент подчитки подсветка текущей записи улетает на самую верхнюю строку.
Похоже на твою ситуацию в том смысле что баг проявляется при добавление новых строк в самый низ грида.
Может кинешь мне пример где у тебя вылазит ошибочка?
Записан
Kostya
Гость
« Ответ #5 : Сентябрь 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 страхуется и перемещает указатель строк в самый верх и рисует скроллбар всегда. А в принципе, если следить за указателем и резко не менять количество строк в запросе - и без скачков вверх все прекрасно работает.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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