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

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

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Прокрутка с прилипанием курсора  (Прочитано 21452 раз)
d13mon
Гость
« : Декабрь 11, 2012, 16:23 »

Здравствуйте,

Никак не могу решить такую проблему. Нужно, чтобы курсор мыши при нажатии на ползунке прокрутки (т.е. при прокручивании через ползунок) не менял своего положения  относительно ползунка. Как бы прилипал к одной точке и не дёргался.
Может у кого есть опыт  подобной реализации? Буду рад любому подсказу, хотя бы в каком направлении копать.


Записан
Bepec
Гость
« Ответ #1 : Декабрь 11, 2012, 16:54 »

mouseMoveEvent.
Но думаю это плохая мысль. Ибо если ты ошибёшься, то курсор мышки хрен куда сдвинешь Улыбающийся
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #2 : Декабрь 11, 2012, 17:03 »

Нужно, чтобы курсор мыши при нажатии на ползунке прокрутки (т.е. при прокручивании через ползунок) не менял своего положения  относительно ползунка. Как бы прилипал к одной точке и не дёргался.
По идее именно так он и должен себя вести.
Рассказывай по-подробнее что и как делаешь.

mouseMoveEvent.
Но думаю это плохая мысль. Ибо если ты ошибёшься, то курсор мышки хрен куда сдвинешь Улыбающийся
И причём здесь mouseMoveEvent Непонимающий Скоре-всего QCursor::setPos()?
« Последнее редактирование: Декабрь 11, 2012, 17:05 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
Bepec
Гость
« Ответ #3 : Декабрь 11, 2012, 22:44 »

А где, извиняюсь, вы будете писать QCursor::setPos()?
Думаю что в функции обработки движения мышки. К примеру mouseMoveEvent Улыбающийся

Но моё имхо - если я тыкнул на слайдер и двигаю, мне ненравится, что меня ограничивают в движении мыши.

Это конечно стилистика и дело каждого.

PS вон в файрфоксе умно сделано. Нажал - двигай, никто тебя не ограничивает. Отвёл на >80 пикселей  в сторону - слайдер уже не двигается. Приблизил - можно двигать.

PPS особенно будет неудобно людям, которые любят себе читаемую строку "проводить" мышкой.
Записан
d13mon
Гость
« Ответ #4 : Декабрь 11, 2012, 23:47 »

Нужно, чтобы курсор мыши при нажатии на ползунке прокрутки (т.е. при прокручивании через ползунок) не менял своего положения  относительно ползунка. Как бы прилипал к одной точке и не дёргался.
По идее именно так он и должен себя вести.
Рассказывай по-подробнее что и как делаешь.

mouseMoveEvent.
Но думаю это плохая мысль. Ибо если ты ошибёшься, то курсор мышки хрен куда сдвинешь Улыбающийся
И причём здесь mouseMoveEvent Непонимающий Скоре-всего QCursor::setPos()?

Возьми любую прокрутку, хотя бы браузера, понаблюдай как ведет себя курсор мыши в момент когда ты тянешь ползунок.
Курсор мыши скачет относительно ползунка, перемещается.

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

setPos  + mouseMoveEvent- это первое что я пробовал. Там получается, что курсор возвращается в исходную позицию, но делает это рывками. Хотя может я ошибся где-то в реализации)

Записан
mutineer
Гость
« Ответ #5 : Декабрь 11, 2012, 23:52 »

Возьми любую прокрутку, хотя бы браузера, понаблюдай как ведет себя курсор мыши в момент когда ты тянешь ползунок.
Курсор мыши скачет относительно ползунка, перемещается.

Взял прокрутку браузера. Вро время таскания ползунка курсор свободно перемещается по оси X относительно ползунка, а вот по оси Y он неподвижен (относительно ползунка)
Записан
d13mon
Гость
« Ответ #6 : Декабрь 12, 2012, 00:25 »

Возьми любую прокрутку, хотя бы браузера, понаблюдай как ведет себя курсор мыши в момент когда ты тянешь ползунок.
Курсор мыши скачет относительно ползунка, перемещается.

Взял прокрутку браузера. Вро время таскания ползунка курсор свободно перемещается по оси X относительно ползунка, а вот по оси Y он неподвижен (относительно ползунка)

Да, у прокрутки браузера действительно по оси Y недвижим.
Но у меня в проге на Qt прокрутка используется для вьюпорта графической сцены. Прокрутка не custom, стандартная, но курсор мыши болтается и по вертикали и по горизонтали в момент перетягивания. Нужно, чтобы курсор не менял своих координат относительно ползунка до тех пор пока не отпустишь мышь. И по X и по Y.

В общем, понятно что нужно использовать QCursor::setPos. Основная проблема в том, как вычислить геометрию ползунка (его контур, регион), чтобы относительно его позиционировать курсор.
В общем, для решения задачи вижу следующие действия:
1) Найти геометрию ползунка
2) Запомнить координаты курсора относительно его области по mousePressEvent
3) По mouseMoveEvent получать текущую геометрию ползунка и выставлять курсор через setPos по сохраненным относительным координатам

Возможно дело в том, что ползунок скинованный через стили.
« Последнее редактирование: Декабрь 12, 2012, 00:28 от d13mon » Записан
d13mon
Гость
« Ответ #7 : Декабрь 12, 2012, 00:34 »

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

Думаю, что ошибся в вычислении геометрии ползунка. Код такой написал:

Код
C++ (Qt)
QRect TimelineScrollbar::sliderRect() const
{
QStyleOptionSlider options;        
options.initFrom(this);
options.maximum = this->maximum();
options.minimum = this->minimum();
options.sliderValue = this->value();
options.sliderPosition = options.sliderValue;
options.singleStep = this->singleStep();
options.pageStep = this->pageStep();
options.orientation = this->orientation();
options.upsideDown = false;
options.state  = QStyle::State_Enabled;
 
return style()->subControlRect(QStyle::CC_ScrollBar, &options, QStyle::SC_ScrollBarSlider);
}
Записан
d13mon
Гость
« Ответ #8 : Декабрь 13, 2012, 18:47 »

Что, ни у кого нет идей по решению задачи вычисления геометрии слайдера прокрутки? никто не юзал стайл-опшены? не верю! Улыбающийся
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #9 : Декабрь 13, 2012, 19:29 »

Что, ни у кого нет идей по решению задачи вычисления геометрии слайдера прокрутки? никто не юзал стайл-опшены? не верю! Улыбающийся
А при чём здесь "стайл-опшены"?
Есть подозрение, что проблема в потере событий. Что делается при такой прокрутке?
Записан

Qt 5.11/4.8.7 (X11/Win)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Декабрь 13, 2012, 19:43 »

Прокрутку с неподвижным курсором видел в одной коммерческой проге, она удобна когда очень большое окно прокрутки и нежелательно перескакивать через какие-то мелкие детали при перетягивании, она получается более плавной как бы.
Вот теперь хочу сделать такую же
Неясно каким образом "прилипание" улучшит плавность. Напр thumb стоит внизу, документ 1000 строк прокручен до упора вниз. Юзверь хватает thumb и дергает его высоко вверх. Что должно происходить? За счет чего достигается плавность?
Записан
Bepec
Гость
« Ответ #11 : Декабрь 13, 2012, 19:44 »

Требования у автора слабые. Ну да пусть.
Стайл опшены? Сударь, о чём вы. Я таких зверей не видел. И я слабо представляю как стиль может повлиять на "плавность".
Записан
d13mon
Гость
« Ответ #12 : Декабрь 14, 2012, 22:27 »

Требования у автора слабые. Ну да пусть.
Стайл опшены? Сударь, о чём вы. Я таких зверей не видел. И я слабо представляю как стиль может повлиять на "плавность".
Прокрутку с неподвижным курсором видел в одной коммерческой проге, она удобна когда очень большое окно прокрутки и нежелательно перескакивать через какие-то мелкие детали при перетягивании, она получается более плавной как бы.
Вот теперь хочу сделать такую же
Неясно каким образом "прилипание" улучшит плавность. Напр thumb стоит внизу, документ 1000 строк прокручен до упора вниз. Юзверь хватает thumb и дергает его высоко вверх. Что должно происходить? За счет чего достигается плавность?
Господа, вижу, что слово "плавность" сбило вас с толку. Нужно просто, чтобы курсор мыши не терял ползунок, иначе при длительной прокрутке есть некоторые неудобства. Пусть это будет самая деревянная прокрутка из всех, главное чтобы курсор намертво прилипал к точке, за которую схватились. 

Стили притом, что несколькими постами выше я обрисовал (возможно, ошибочно) проблему, из-за которой я не могу точно отследить геометрию ползунка  и соотвественно приклеить курсор к ползунку. Он дергается в процессе перетягивания. Там в стилях (в том числе в группе классов семейства QStyleOption) много настроек и нюансов, которые я слабо знаю и подозреваю что где-то ошибся, потому и обращаюсь за помощью.
Записан
d13mon
Гость
« Ответ #13 : Декабрь 14, 2012, 22:44 »

Неясно каким образом "прилипание" улучшит плавность. Напр thumb стоит внизу, документ 1000 строк прокручен до упора вниз. Юзверь хватает thumb и дергает его высоко вверх. Что должно происходить? За счет чего достигается плавность?
Могу уточнить: пусть у нас не 1000, а миллион строк. thumb в крайнем верхнем положении. Окно просмотра небольшое, видно только 100 строк.  thumb очень маленький из-за масштабов. Юзер хватает слайдер, дергает и прокручивает на строку с номером 100 000. А ему нужно спозиционироваться на 101-ю строку. Если курсор прилипает ( как в реализации что я видел), то происходит замедленный скроллинг, благодаря чему исключается ситуация перекручивания нужной позиции. Происходит более точное позиционирование. И так как курсор прилипает (а там наверняка происходит возвращение позиции), то можно довольно долго тянуть и не выйти за границы экрана
Записан
Bepec
Гость
« Ответ #14 : Декабрь 14, 2012, 23:01 »

Вы не умеете пока формулировать мысли. Вам нужен не "плавный" и "прилипчивый" курсор. Вам нужен просто последовательный переход по списку.
Так сами и реализуйте. Если разница от последнего движения < 20 допустим, тогда сдвигаем на 1/2/3/4 и т.д. Если >20 тогда двигать стандартно. В чём проблема?
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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