Russian Qt Forum

Qt => Вопросы новичков => Тема начата: once_again_abc от Октябрь 04, 2011, 05:57



Название: Как заблокировать курсор в заданной области?
Отправлено: once_again_abc от Октябрь 04, 2011, 05:57
ставлю фильтр, ловлю все мышиные перемещения. хочу ограничить пермещения курсора при нажатой клавише заданным регионом QRect. сейчас делаю вот так:
Код:
mouseMoveEvent( QMouseEvent * pEvent ) {

        if( pEvent->pos().x() > m_Rect.x() + m_Rect.width() ) {
            printf( "[%s] Old: %d, %d, New: %d, %d", __FUNCTION__, pEvent->pos().x(), pEvent->pos().y(), m_Rect.x() + m_Rect.width(), pEvent->pos().y() );
            cursor().setPos( mapToGlobal( QPoint(m_Rect.x() + m_Rect.width(), pEvent->pos().y()) ) );
            return;
        }
}

этот способ работает, но недостаточно хорошо. например если быстро дергать мышью, курсор будет дергаться из-за того, что mouseMoveEvent слишком поздно делает cursor().setPos:

[4648] [::mouseMoveEvent] Old: 812, 159, New: 808, 159
[4648] [::mouseMoveEvent] Old: 819, 159, New: 808, 159
[4648] [::mouseMoveEvent] Old: 854, 158, New: 808, 158

как "железно" заблокировать курсор в некоторой области так, чтобы скорость перемещения мыши не влияла на ситуацию? т.е. в моем данном примере курсор оказался в позициях 812, 819 и 854 хотя я ограничиваю его позицией 808. получается что mouseMoveEvent не всегда вызывается правильно?


Название: Re: Как заблокировать курсор в заданной области?
Отправлено: Bepec от Октябрь 04, 2011, 07:31
Насколько я понимаю, mouseMoveEvent вызывается тогда, когда событие уже произошло.

И к тому же опять таки по коду, ты не ставишь фильтр событий, а ловишь просто перемещение мыши на самой форме.

Можешь обратить внимание на QObject::eventFilter( QObject * watched, QEvent * event). По идее должно помочь, но я не использовал ниразу.

PS mouseMoveEvent вызывается ПОСЛЕ перемещения, значит работает правильно :)