Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt GUI _ Ограничить перемещение курсора

Автор: Delaar 3.12.2011, 15:55

Добрый день, форумчане. Подскажите, каким образом разрешить курсору перемещение
в пределах одного виджета.
На данный момент пробую подход с SetMouseTracking(true) у нужного виджета
и обработчика mouseMoveEvent, где проверяются текущие координаты курсора и в случае
их выхода за пределы виджета - они изменяются на допустимые.
Возникает проблема, которую решить не могу: при медленном движении мыши курсор
действительно удерживается в пределах виджета, но при быстром - выходит за его пределы.

Автор: Dovgon 3.12.2011, 16:37

приведи код.

Автор: Delaar 3.12.2011, 17:15

Cюда прикрепить не смог, ссылка: http://webfile.ru/5706577
Там все проект, проблема в battlefieldbutton.cpp

Автор: Delaar 3.12.2011, 17:18

Cюда прикрепить не смог, ссылка: http://webfile.ru/5706577
Там все проект, проблема в battlefieldbutton.cpp

Дополнение...пока кое-как ограничивается только движение вправо от центра scrollarea.

Автор: ilyabvt 3.12.2011, 18:36

Цитата
но при быстром - выходит за его пределы.

Проблема связана с тем что не успевает генерироваться событие. Можно решить путем установки EventFilter на приложение (QApplication), тогда можно будет контролировать координаты мыши даже если она успеет выйти за пределы виджета.
http://doc.qt.nokia.com/latest/eventsandfilters.html
http://doc.qt.nokia.com/latest/qobject.html#installEventFilter

Автор: Dovgon 4.12.2011, 9:26

так просто не получится, надо делать в MainWindow mouseMoveEvent, после сигналом передовать в BattleFieldButton передовать QMouseEvent *mouse::globalX();
В самом BattleFieldButton слоте делать гдето так

int xPos=parent_widget->pos().x()+parent_widget->rect().width(); пробуй.
if (globalX >= xPos)
        QCursor::setPos(kursor - QPoint(globalX-xPosOld+2,0 ) );

где xPosOld предвидущий globalX т.к движение не обязательно на 1 pix.

Автор: Delaar 4.12.2011, 23:36

Благодарю всех отписавшихся. Попробовал фильтры, не заработало как надо (курсор таки мог вылететь за пределы дозволенного).
Решил поставить к виджету таймер, и в обработчике, если нужно - задавать координаты курсора. Таки получилось, как хотел.
По ссылке ниже - проект. Смотреть battlescrollarea.

http://webfile.ru/5708617

Автор: ssoft 5.12.2011, 7:06

Нужно обязательно переопределить событие leaveEvent
Оно возникает при попытке курсора мыши покинуть widget.

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)