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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: движение мыши по горизонтали  (Прочитано 6125 раз)
vux
Гость
« : Ноябрь 04, 2011, 12:57 »

В евент фильтре я проверяю событие MouseMove.
Но мне нужно узнать движеться ли мышь по горизонтали с каким нибуть допуском по вертикали например(-10,+10)
Вообщем нужно исполнять код если мыша двигаеться конкретно по горизонтали
Как это можно реализовать
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #1 : Ноябрь 04, 2011, 14:25 »

надо запоминать старую координату движения и сравнивать ее с текущей (для горизонтали тоже надо небольшое отклонение допускать, например в 1-2 пикселя - сложно вести курсор идеально по горизонтали):
Код
C++ (Qt)
if (qAbs(oldPos.x() - event->pos().x()) <= 2 && qAbs(oldPos.y() - event->pos().y()) <= 10)
{
...
}
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
AnubiSAD
Гость
« Ответ #2 : Ноябрь 07, 2011, 07:35 »

Тяжело это все проверить! Запоминать старые координаты как-то выглядит не очень, потому что не знаем в какой момент их надо запоминать. Мышь ведь с разной скоростью перемещаться может. Вот если бы еще как-то скорость перемещения отслеживать. Но что-то чересчур прям сложно. А что конкретно нужно вот этим перемещением по горизонтали отслеживать? Может какое-нибудь попроще условие можно взять?
Записан
vux
Гость
« Ответ #3 : Ноябрь 07, 2011, 10:14 »

У меня сейцас код такой

Код
Python
if (currentMouseY - lastMouseY) > 0:
 # Движение по вертикали

все работает нормально
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #4 : Ноябрь 07, 2011, 11:51 »

может так и нужно, но таким образом будет учитываться только движение вниз
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Ноябрь 07, 2011, 12:17 »

Тяжело это все проверить! Запоминать старые координаты как-то выглядит не очень, потому что не знаем в какой момент их надо запоминать. Мышь ведь с разной скоростью перемещаться может. Вот если бы еще как-то скорость перемещения отслеживать. Но что-то чересчур прям сложно. А что конкретно нужно вот этим перемещением по горизонтали отслеживать? Может какое-нибудь попроще условие можно взять?
Иногда делают так:

- пользователь "просто" тянет выбранный объект - оба перемещения мыши учитываются

- пользователь тянет объект с нажатой клавишей - тогда по первому перемещению выбирается бOльшая X или Y и объект двигается вдоль этой оси

Это довольно удобно, клавиша напр Alt. Часто к этому добавлено движение клавишами-стрелочками (просто так 1 пиксель, с shift - напр 10 пикселей)
Записан
Рома
Гость
« Ответ #6 : Ноябрь 08, 2011, 22:41 »

Думаю, можно еще так сделать:
В классе создать масив из QPoint (последние положения курсора). При каждом движении миши в конец этого масива добавлять новое положение курсора, а потом проверять все ли элементи удовлетворяют такие условия:
1. Разница между максимальным и минимальным Y в этом масиве меньше 20.
2. Все Х либо возростают, либо уменьшаются.
Тогда это значит что: если Х возростают то мышь двигается вправо, в другом случае - влево.
Если условия не удовлетворяются - удаляются все елементы масива, кроме последнего.
Ну и еще, думаю будет неплохо щитать, что мышь действительно двигается по горизонтали, если размер масива не меньше 15.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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