Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: vux от Ноябрь 04, 2011, 12:57



Название: движение мыши по горизонтали
Отправлено: vux от Ноябрь 04, 2011, 12:57
В евент фильтре я проверяю событие MouseMove.
Но мне нужно узнать движеться ли мышь по горизонтали с каким нибуть допуском по вертикали например(-10,+10)
Вообщем нужно исполнять код если мыша двигаеться конкретно по горизонтали
Как это можно реализовать


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


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


Название: Re: движение мыши по горизонтали
Отправлено: vux от Ноябрь 07, 2011, 10:14
У меня сейцас код такой

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

все работает нормально


Название: Re: движение мыши по горизонтали
Отправлено: kambala от Ноябрь 07, 2011, 11:51
может так и нужно, но таким образом будет учитываться только движение вниз


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

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

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

Это довольно удобно, клавиша напр Alt. Часто к этому добавлено движение клавишами-стрелочками (просто так 1 пиксель, с shift - напр 10 пикселей)


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