Название: Прокрутка с прилипанием курсора Отправлено: d13mon от Декабрь 11, 2012, 16:23 Здравствуйте,
Никак не могу решить такую проблему. Нужно, чтобы курсор мыши при нажатии на ползунке прокрутки (т.е. при прокручивании через ползунок) не менял своего положения относительно ползунка. Как бы прилипал к одной точке и не дёргался. Может у кого есть опыт подобной реализации? Буду рад любому подсказу, хотя бы в каком направлении копать. Название: Re: Прокрутка с прилипанием курсора Отправлено: Bepec от Декабрь 11, 2012, 16:54 mouseMoveEvent.
Но думаю это плохая мысль. Ибо если ты ошибёшься, то курсор мышки хрен куда сдвинешь :) Название: Re: Прокрутка с прилипанием курсора Отправлено: GreatSnake от Декабрь 11, 2012, 17:03 Нужно, чтобы курсор мыши при нажатии на ползунке прокрутки (т.е. при прокручивании через ползунок) не менял своего положения относительно ползунка. Как бы прилипал к одной точке и не дёргался. По идее именно так он и должен себя вести.Рассказывай по-подробнее что и как делаешь. mouseMoveEvent. И причём здесь mouseMoveEvent ??? Скоре-всего QCursor::setPos()?Но думаю это плохая мысль. Ибо если ты ошибёшься, то курсор мышки хрен куда сдвинешь :) Название: Re: Прокрутка с прилипанием курсора Отправлено: Bepec от Декабрь 11, 2012, 22:44 А где, извиняюсь, вы будете писать QCursor::setPos()?
Думаю что в функции обработки движения мышки. К примеру mouseMoveEvent :) Но моё имхо - если я тыкнул на слайдер и двигаю, мне ненравится, что меня ограничивают в движении мыши. Это конечно стилистика и дело каждого. PS вон в файрфоксе умно сделано. Нажал - двигай, никто тебя не ограничивает. Отвёл на >80 пикселей в сторону - слайдер уже не двигается. Приблизил - можно двигать. PPS особенно будет неудобно людям, которые любят себе читаемую строку "проводить" мышкой. Название: Re: Прокрутка с прилипанием курсора Отправлено: d13mon от Декабрь 11, 2012, 23:47 Нужно, чтобы курсор мыши при нажатии на ползунке прокрутки (т.е. при прокручивании через ползунок) не менял своего положения относительно ползунка. Как бы прилипал к одной точке и не дёргался. По идее именно так он и должен себя вести.Рассказывай по-подробнее что и как делаешь. mouseMoveEvent. И причём здесь mouseMoveEvent ??? Скоре-всего QCursor::setPos()?Но думаю это плохая мысль. Ибо если ты ошибёшься, то курсор мышки хрен куда сдвинешь :) Возьми любую прокрутку, хотя бы браузера, понаблюдай как ведет себя курсор мыши в момент когда ты тянешь ползунок. Курсор мыши скачет относительно ползунка, перемещается. Прокрутку с неподвижным курсором видел в одной коммерческой проге, она удобна когда очень большое окно прокрутки и нежелательно перескакивать через какие-то мелкие детали при перетягивании, она получается более плавной как бы. Вот теперь хочу сделать такую же setPos + mouseMoveEvent- это первое что я пробовал. Там получается, что курсор возвращается в исходную позицию, но делает это рывками. Хотя может я ошибся где-то в реализации) Название: Re: Прокрутка с прилипанием курсора Отправлено: mutineer от Декабрь 11, 2012, 23:52 Возьми любую прокрутку, хотя бы браузера, понаблюдай как ведет себя курсор мыши в момент когда ты тянешь ползунок. Курсор мыши скачет относительно ползунка, перемещается. Взял прокрутку браузера. Вро время таскания ползунка курсор свободно перемещается по оси X относительно ползунка, а вот по оси Y он неподвижен (относительно ползунка) Название: Re: Прокрутка с прилипанием курсора Отправлено: d13mon от Декабрь 12, 2012, 00:25 Возьми любую прокрутку, хотя бы браузера, понаблюдай как ведет себя курсор мыши в момент когда ты тянешь ползунок. Курсор мыши скачет относительно ползунка, перемещается. Взял прокрутку браузера. Вро время таскания ползунка курсор свободно перемещается по оси X относительно ползунка, а вот по оси Y он неподвижен (относительно ползунка) Да, у прокрутки браузера действительно по оси Y недвижим. Но у меня в проге на Qt прокрутка используется для вьюпорта графической сцены. Прокрутка не custom, стандартная, но курсор мыши болтается и по вертикали и по горизонтали в момент перетягивания. Нужно, чтобы курсор не менял своих координат относительно ползунка до тех пор пока не отпустишь мышь. И по X и по Y. В общем, понятно что нужно использовать QCursor::setPos. Основная проблема в том, как вычислить геометрию ползунка (его контур, регион), чтобы относительно его позиционировать курсор. В общем, для решения задачи вижу следующие действия: 1) Найти геометрию ползунка 2) Запомнить координаты курсора относительно его области по mousePressEvent 3) По mouseMoveEvent получать текущую геометрию ползунка и выставлять курсор через setPos по сохраненным относительным координатам Возможно дело в том, что ползунок скинованный через стили. Название: Re: Прокрутка с прилипанием курсора Отправлено: d13mon от Декабрь 12, 2012, 00:34 В общем, не получается нормально отпозиционировать курсор, чтобы он был реально недвижим. Прицепить-то его прицепил, а он дергается некрасиво, совсем не гуд
Думаю, что ошибся в вычислении геометрии ползунка. Код такой написал: Код
Название: Re: Прокрутка с прилипанием курсора Отправлено: d13mon от Декабрь 13, 2012, 18:47 Что, ни у кого нет идей по решению задачи вычисления геометрии слайдера прокрутки? никто не юзал стайл-опшены? не верю! :)
Название: Re: Прокрутка с прилипанием курсора Отправлено: GreatSnake от Декабрь 13, 2012, 19:29 Что, ни у кого нет идей по решению задачи вычисления геометрии слайдера прокрутки? никто не юзал стайл-опшены? не верю! :) А при чём здесь "стайл-опшены"?Есть подозрение, что проблема в потере событий. Что делается при такой прокрутке? Название: Re: Прокрутка с прилипанием курсора Отправлено: Igors от Декабрь 13, 2012, 19:43 Прокрутку с неподвижным курсором видел в одной коммерческой проге, она удобна когда очень большое окно прокрутки и нежелательно перескакивать через какие-то мелкие детали при перетягивании, она получается более плавной как бы. Неясно каким образом "прилипание" улучшит плавность. Напр thumb стоит внизу, документ 1000 строк прокручен до упора вниз. Юзверь хватает thumb и дергает его высоко вверх. Что должно происходить? За счет чего достигается плавность?Вот теперь хочу сделать такую же Название: Re: Прокрутка с прилипанием курсора Отправлено: Bepec от Декабрь 13, 2012, 19:44 Требования у автора слабые. Ну да пусть.
Стайл опшены? Сударь, о чём вы. Я таких зверей не видел. И я слабо представляю как стиль может повлиять на "плавность". Название: Re: Прокрутка с прилипанием курсора Отправлено: d13mon от Декабрь 14, 2012, 22:27 Требования у автора слабые. Ну да пусть. Стайл опшены? Сударь, о чём вы. Я таких зверей не видел. И я слабо представляю как стиль может повлиять на "плавность". Прокрутку с неподвижным курсором видел в одной коммерческой проге, она удобна когда очень большое окно прокрутки и нежелательно перескакивать через какие-то мелкие детали при перетягивании, она получается более плавной как бы. Неясно каким образом "прилипание" улучшит плавность. Напр thumb стоит внизу, документ 1000 строк прокручен до упора вниз. Юзверь хватает thumb и дергает его высоко вверх. Что должно происходить? За счет чего достигается плавность?Вот теперь хочу сделать такую же Стили притом, что несколькими постами выше я обрисовал (возможно, ошибочно) проблему, из-за которой я не могу точно отследить геометрию ползунка и соотвественно приклеить курсор к ползунку. Он дергается в процессе перетягивания. Там в стилях (в том числе в группе классов семейства QStyleOption) много настроек и нюансов, которые я слабо знаю и подозреваю что где-то ошибся, потому и обращаюсь за помощью. Название: Re: Прокрутка с прилипанием курсора Отправлено: d13mon от Декабрь 14, 2012, 22:44 Неясно каким образом "прилипание" улучшит плавность. Напр thumb стоит внизу, документ 1000 строк прокручен до упора вниз. Юзверь хватает thumb и дергает его высоко вверх. Что должно происходить? За счет чего достигается плавность? Могу уточнить: пусть у нас не 1000, а миллион строк. thumb в крайнем верхнем положении. Окно просмотра небольшое, видно только 100 строк. thumb очень маленький из-за масштабов. Юзер хватает слайдер, дергает и прокручивает на строку с номером 100 000. А ему нужно спозиционироваться на 101-ю строку. Если курсор прилипает ( как в реализации что я видел), то происходит замедленный скроллинг, благодаря чему исключается ситуация перекручивания нужной позиции. Происходит более точное позиционирование. И так как курсор прилипает (а там наверняка происходит возвращение позиции), то можно довольно долго тянуть и не выйти за границы экранаНазвание: Re: Прокрутка с прилипанием курсора Отправлено: Bepec от Декабрь 14, 2012, 23:01 Вы не умеете пока формулировать мысли. Вам нужен не "плавный" и "прилипчивый" курсор. Вам нужен просто последовательный переход по списку.
Так сами и реализуйте. Если разница от последнего движения < 20 допустим, тогда сдвигаем на 1/2/3/4 и т.д. Если >20 тогда двигать стандартно. В чём проблема? Название: Re: Прокрутка с прилипанием курсора Отправлено: d13mon от Декабрь 14, 2012, 23:41 Вы не умеете пока формулировать мысли. Вам нужен не "плавный" и "прилипчивый" курсор. Вам нужен просто последовательный переход по списку. Я прекрасно всё сформулировал - мне нужен прилипчивый курсор, это основная задача. А нужную плавность ползунка я действительно и сам могу реализовать. Это дело 10-е. Так сами и реализуйте. Если разница от последнего движения < 20 допустим, тогда сдвигаем на 1/2/3/4 и т.д. Если >20 тогда двигать стандартно. В чём проблема? Название: Re: Прокрутка с прилипанием курсора Отправлено: Igors от Декабрь 14, 2012, 23:57 Могу уточнить: пусть у нас не 1000, а миллион строк. thumb в крайнем верхнем положении. Окно просмотра небольшое, видно только 100 строк. thumb очень маленький из-за масштабов. Юзер хватает слайдер, дергает и прокручивает на строку с номером 100 000. А ему нужно спозиционироваться на 101-ю строку. Если курсор прилипает ( как в реализации что я видел), то происходит замедленный скроллинг, благодаря чему исключается ситуация перекручивания нужной позиции. Происходит более точное позиционирование. И так как курсор прилипает (а там наверняка происходит возвращение позиции), то можно довольно долго тянуть и не выйти за границы экрана Не уверен что Вы меня правильно поймете (наверняка наоборот), но все же я попробую объяснить.Любая вещь имеет "шипы и розы", а UI особенно. Все прекрасно пока мы пользуемся мощностями фреймворка - лихо и быстро. И даже возникают мысли/иллюзии типа "какой я талантливый, как быстро разобрался!" :) Но вот когда мы пытаемся погладить эту кошку против шерсти - ничего хорошего не выходит. Вы упорно пытаетесь делать именно так - конечно это Ваше право. Но не лучше ли "собирать розы" и "обходить шипы"? Это куда более практично и (не побоюсь этого слова) профессионально. В реальном проекте даже 2 дня на "крутой скроллинг" - недопустимая роскошь - пусть скроллинг безумно крут. C'est la vie Название: Re: Прокрутка с прилипанием курсора Отправлено: Bepec от Декабрь 15, 2012, 11:54 Я несогласен, Igors.
Для обучения и пробы сил, такие плюшечки очень полезны ) Заодно как раз твой совет поймёт :D Но я до сих пор не понял чего хочет автор :) Потому и помочь не могу. PS вот если б он допустим нарисовал все состояния и переходы между ними, или же выложил тестовый проект с проблемой - тогда да. Название: Re: Прокрутка с прилипанием курсора Отправлено: GreatSnake от Декабрь 15, 2012, 12:02 Могу уточнить: пусть у нас не 1000, а миллион строк. Коли разговор идёт о таком количестве строк, о каком "прилипании" и вообще юзабельности может идти речь ???Надо вообще перепроектировать интерфейс, а не забивать себе голову прокрутками. Название: Re: Прокрутка с прилипанием курсора Отправлено: Igors от Декабрь 15, 2012, 12:21 Для обучения и пробы сил, такие плюшечки очень полезны ) "Вообще говоря" да, но UI для этого, пожалуй, наихудшее место - все уходит в изучение потрохов чужих классов, проектирование практически на нулеНазвание: Re: Прокрутка с прилипанием курсора Отправлено: Bepec от Декабрь 15, 2012, 14:18 Чем больше изучаешь чужих потрохов, тем опытнее становишься сам :D Прямая пропорциональность изучения хорошего кода.
PS хотя и я сам не достиг Название: Re: Прокрутка с прилипанием курсора Отправлено: Igors от Декабрь 15, 2012, 14:34 Чем больше изучаешь чужих потрохов, тем опытнее становишься сам :D Прямая пропорциональность изучения хорошего кода. Мне кажется за европейскую зарплату он мог быть и лучше :). Пропорциональность описывается формулойE = 1.0 - e^(-kt), где E - достигнутый эффект t - время изучения k - способности изучающего И по ходу дела усилим Вас в "графике" - чему там соответствует эта формула? Название: Re: Прокрутка с прилипанием курсора Отправлено: Bepec от Декабрь 15, 2012, 14:49 хз если честно ) Приводить реального человека к формулам бессмысленно :) Слишком большой разброс параметров :D
Название: Re: Прокрутка с прилипанием курсора Отправлено: d13mon от Декабрь 15, 2012, 20:41 Могу уточнить: пусть у нас не 1000, а миллион строк. thumb в крайнем верхнем положении. Окно просмотра небольшое, видно только 100 строк. thumb очень маленький из-за масштабов. Юзер хватает слайдер, дергает и прокручивает на строку с номером 100 000. А ему нужно спозиционироваться на 101-ю строку. Если курсор прилипает ( как в реализации что я видел), то происходит замедленный скроллинг, благодаря чему исключается ситуация перекручивания нужной позиции. Происходит более точное позиционирование. И так как курсор прилипает (а там наверняка происходит возвращение позиции), то можно довольно долго тянуть и не выйти за границы экрана Не уверен что Вы меня правильно поймете (наверняка наоборот), но все же я попробую объяснить.Любая вещь имеет "шипы и розы", а UI особенно. Все прекрасно пока мы пользуемся мощностями фреймворка - лихо и быстро. И даже возникают мысли/иллюзии типа "какой я талантливый, как быстро разобрался!" :) Но вот когда мы пытаемся погладить эту кошку против шерсти - ничего хорошего не выходит. Вы упорно пытаетесь делать именно так - конечно это Ваше право. Но не лучше ли "собирать розы" и "обходить шипы"? Это куда более практично и (не побоюсь этого слова) профессионально. В реальном проекте даже 2 дня на "крутой скроллинг" - недопустимая роскошь - пусть скроллинг безумно крут. C'est la vie Совет бесспорно хороший, спасибо, но только не в моей ситуации. Ладно, давайте пойдем другим путем. :) Я работаю над проектом, у меня есть требование заказчика - сделать прилипание курсора к слайдеру. Вот захотел он и всё, и его не колышет, сколько времени нужно убить на эту фичу. Я повозился, реализовать нормально не получилось, дальше париться не стал - решил спросить у местных гуру программирования, может кто реализовывал или может кто знает, как это реализуется. Пока я не увидел каких-то полезных советов, только вопросы вроде "Зачем тебе это нужно?" или "Чего ты хочешь добиться?". Я хочу добиться "мертвого" прилипания курсора к слайдеру и всё.:) Название: Re: Прокрутка с прилипанием курсора Отправлено: d13mon от Декабрь 15, 2012, 20:45 Могу уточнить: пусть у нас не 1000, а миллион строк. Коли разговор идёт о таком количестве строк, о каком "прилипании" и вообще юзабельности может идти речь ???Надо вообще перепроектировать интерфейс, а не забивать себе голову прокрутками. Название: Re: Прокрутка с прилипанием курсора Отправлено: mutineer от Декабрь 15, 2012, 21:08 Я хочу добиться "мертвого" прилипания курсора к слайдеру и всё.:) Имхо "мертвого" прилипания ты не получишь - перемещением курсора управляется осью, ты можешь на него среагировать и курсор вернуть назад, но при этом будет видно дергание. Разве что ты скроешь курсор и налепишь на слайдер имитацию, которой будешь управлять уже сам Название: Re: Прокрутка с прилипанием курсора Отправлено: Igors от Декабрь 15, 2012, 22:23 Пока я не увидел каких-то полезных советов, только вопросы вроде "Зачем тебе это нужно?" или "Чего ты хочешь добиться?". Я хочу добиться "мертвого" прилипания курсора к слайдеру и всё.:) Не стоит "фыркать" :) Рано или поздно время все расставляет по своим местам. Ваш первый пост был 11 декабря, минимум 4 дня Вы уже посвятили этой возне. И что-то мне подсказывает что и через неделю, и две ничего реально не изменится. И придется искать другие архитектурные решения, разница (непринципиальная) только в том сколько времени Вы потеряете. В 3D сцене скроллбаров нет и никогда не было, т.к. их несостоятельность выясняется очень быстро. Но и в 2D они уже давно скорее "дань традиции". Если картинка приличная - скроллбаром ничего путного не получить, используются др средства/приемы навигации которые хорошо известны. Хотите поупираться рогом и доказать обратное - ну флаг Вам в руки. А мы посмотрим (и может напомним) Как говорится, "Ваше упорство заслуживает лучшего применения" :) Название: Re: Прокрутка с прилипанием курсора Отправлено: Bepec от Декабрь 15, 2012, 23:59 Если ты нарисуешь или сделаешь проект, в котором показывается в чем у тебя проблема, я посмотрю. Если не сделаешь или не нарисуешь, тогда не посмотрю.
Название: Re: Прокрутка с прилипанием курсора Отправлено: d13mon от Декабрь 17, 2012, 18:53 Записал видео,в нем наглядно видно, какой эффект ожидается. Это из коммерческй программы, в которой данная фича была замечена. На чем реализовано - не знаю. У меня похожий контрол, только на qt, с использованием QGraphicsScene.
http://webfile.ru/6272936 (http://webfile.ru/6272936) Вес - 584Кб Название: Re: Прокрутка с прилипанием курсора Отправлено: d13mon от Декабрь 17, 2012, 18:58 И что-то мне подсказывает что и через неделю, и две ничего реально не изменится. И придется искать другие архитектурные решения, разница (непринципиальная) только в том сколько времени Вы потеряете. Я рассматриваю с позиции "всё можно реализовать".В 3D сцене скроллбаров нет и никогда не было, т.к. их несостоятельность выясняется очень быстро. Но и в 2D они уже давно скорее "дань традиции". Если картинка приличная - скроллбаром ничего путного не получить, используются др средства/приемы навигации которые хорошо известны. Хотите поупираться рогом и доказать обратное - ну флаг Вам в руки. А мы посмотрим (и может напомним) Да, у меня 2D сцена. Постом выше я приаттачил видео, где видна проблема и область применения этой фичи. Прокрутка во вьюпорте - это разве "дань традиции"?) Название: Re: Прокрутка с прилипанием курсора Отправлено: d13mon от Декабрь 17, 2012, 19:01 Я хочу добиться "мертвого" прилипания курсора к слайдеру и всё.:) Имхо "мертвого" прилипания ты не получишь - перемещением курсора управляется осью, ты можешь на него среагировать и курсор вернуть назад, но при этом будет видно дергание. Разве что ты скроешь курсор и налепишь на слайдер имитацию, которой будешь управлять уже сам Интересная мысль, спасибо. Например сделать скинованное окошко в форме курсора (через маски) и лепить его на нужную позицию, а реальный курсор скрывать? Я даже думаю, что у них (видео приаттачил выше) так и сделано. Название: Re: Прокрутка с прилипанием курсора Отправлено: mutineer от Декабрь 17, 2012, 19:07 Я хочу добиться "мертвого" прилипания курсора к слайдеру и всё.:) Имхо "мертвого" прилипания ты не получишь - перемещением курсора управляется осью, ты можешь на него среагировать и курсор вернуть назад, но при этом будет видно дергание. Разве что ты скроешь курсор и налепишь на слайдер имитацию, которой будешь управлять уже сам Интересная мысль, спасибо. Например сделать скинованное окошко в форме курсора (через маски) и лепить его на нужную позицию, а реальный курсор скрывать? Видео у тебя не особо хорошего качества, но курсор в момент скроллинга отличается от обычного курсора. Возможно что реальный курсор скрыт (на что дополнительно намекает дергающийся красный кружочек, который по идее должен отображать пололжение курсора), а к скроллеру прицеплена картинка Название: Re: Прокрутка с прилипанием курсора Отправлено: d13mon от Декабрь 17, 2012, 19:10 Видео у тебя не особо хорошего качества, но курсор в момент скроллинга отличается от обычного курсора. Возможно что реальный курсор скрыт (на что дополнительно намекает дергающийся красный кружочек, который по идее должен отображать пололжение курсора), а к скроллеру прицеплена картинка Ну да, я тоже обратил внимание, что реальный курсор дергается, но он невидимНазвание: Re: Прокрутка с прилипанием курсора Отправлено: Bepec от Декабрь 17, 2012, 19:15 Вот и разобрались :D Надо было сразу видео выкладывать, не было б стольки рассуждений :D
Название: Re: Прокрутка с прилипанием курсора Отправлено: d13mon от Декабрь 17, 2012, 19:16 Вот и разобрались :D Надо было сразу видео выкладывать, не было б стольки рассуждений :D Истина рождается в рассуждениях:)Всем рассуждающим в данной теме спасибо! Название: Re: Прокрутка с прилипанием курсора Отправлено: panAlexey от Декабрь 17, 2012, 20:39 Пока я не увидел каких-то полезных советов, только вопросы вроде "Зачем тебе это нужно?" или "Чего ты хочешь добиться?". Я хочу добиться "мертвого" прилипания курсора к слайдеру и всё.:) Может скрыть сам курсор, а на ползунке его нарисовать? :)Совет конечно крейзевый, но может поможет? :) ПС Это продолжение бесконечной линейки? :) ПС2. Уже дали совет, припозднился я :) Название: Re: Прокрутка с прилипанием курсора Отправлено: Igors от Декабрь 17, 2012, 21:38 Да, у меня 2D сцена. Постом выше я приаттачил видео, где видна проблема и область применения этой фичи. Прокрутка во вьюпорте - это разве "дань традиции"?) У меня в приложении есть окно похожее на то что в видео. Еще до того как я пришел в проект все было придумано - и работает норм уже довольно много лет. Вот навигация- скроллеры "обычные", куда попал - туда и попал - альтернативный (фактически основной) скролл: курсор "рука" - появляется когда нажат пробел (см напр Photoshop) - выбор (zoom) рамкой - zoom по x/y - бубочка "вписать все" Все это не вызывает никаких затруднений в реализации и практически стандартно во многих приложениях. Так чего городить огород? :) Название: Re: Прокрутка с прилипанием курсора Отправлено: Igors от Декабрь 28, 2012, 14:06 d13mon, так чем же дело кончилось? Удалось прилепить курсор? Если да - поделитесь, покажите. Пусть я не собираюсь это у себя делать, но знать что такое решение возможно не помешает
Спасибо Название: Re: Прокрутка с прилипанием курсора Отправлено: gil9red от Январь 02, 2013, 18:03 Даешь минимально компилируемый работающий пример, дабы подобные темы не создавались снова!))) :D
|